pyspark应用技巧

本文介绍了如何优化Pyspark性能,包括使用Apache Arrow加速Spark SDF与Pandas PDF之间的转换,优先选择Pandas UDF而非UDF,详细解释了不同类型的Pandas UDF,展示了如何向Pandas UDF传入额外参数,以及如何在Spark中使用Java UDF。此外,还讨论了如何分发文件到Spark worker,解决在分布式环境中找不到依赖文件的问题。
摘要由CSDN通过智能技术生成

1. spark sdf和pandas pdf相互转化

一般spark sdf转化为pandas pdf使用sdf.toPandas(), pdf转化为sdf使用spark.createDataFrame(pdf),但是直接转化中间的序列化和反序列化耗时很长,所以在执行转化的时候使用apache arrow进行加速

pyarrow版本 >= 0.8.0

spark-defaults.conf文件添加:

spark.sql.execution.arrow.enabled true

或者在设置spark conf时设置:

conf = SparkConf().setAppName("Test").setMaster("local[*]")
conf.set("spark.sql.execution.arrow.enabled", True)

别人的对比:

execution.arrow.enabled pdf -> sdf sdf -> pdf
false 4980ms 722ms
true 72ms 79ms

tips: 尽管转化速度提高了,但pdf是单核运算,并没有用到分布式处理,所以最好不要处理大数据量。
当计算不适用于用arrow优化的时候可以自动退回非arrow优化的方式,这是配置参数为spark.sql.execution.arrow.fallback.enabled

每批进行向量化计算的数据量由spark.sql.execution.arrow.maxRecordsPerBatch参数控制,默认10000条

2. sdf构建自定义函数时优先使用pandas_udf而不是udf

pandas udf建立在Apache arrow之上,带来了低开销, 高性能的udf,并且使用了pandas的向量化操作;而spark的udf是对每一条数据进行操作,这样就带来了性能的问题。但是pandas udf有一些数据类型不支持,例如:BinaryType,MapType, TimestampType 和嵌套的 StructType。

注意:有些低级的pyarrow版本在使用pandas_udf时会出错,因此最好使用比较高一点的版本
下面所有代码运行于linux系统中,python3.5包:numpy (1.17.0),pandas (0.25.2),pyarrow (0.13.0)

from pyspark import SparkConf
from pyspark.sql import SparkSession, Row
from pyspark.sql.functions import pandas_udf, PandasUDFType
import pyspark.sql.functions as F
from pyspark.sql.types import StringType

conf = SparkConf().setAppName("test").setMaster("local")
spark = SparkSession.builder.config(conf=conf).getOrCreate()

SCALAR

one or more pandas.Series -> one pandas.Series, 长度必须和原来的一致,2.4.3不支持MapType和StructType.
与dataframe.withColumn或dataframe.select一起使用

df = spark.createDataFrame([(1, 'goods'), (1, 'good'), (1, 'god'), (2, 'thanks'), (2, 'thank')], schema=['x', 'y'])
# to upper strings
@pandas_udf(StringType(), PandasUDFType.SCALAR)
def to_upper(s):
    return s.str.upper()

df.select(df.x, to_upper(df.y)).show()  # 1


df = spark.createDataFrame([[1, 2, 4], [-1, 2, 2]], ['a', 'b', 'c'])
# input multi-pandas.Series, pay attention to the returnType
@pandas_udf('double', PandasUDFType.SCALAR)
def fun_function(a, b, c
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Pyspark是一个运行在Python中的Spark API,可以用于处理大规模数据集。而Hive是一个基于Hadoop的数据仓库工具,可以进行数据存储、管理和查询。结合起来,Pyspark和Hive可以提供强大的数据处理和分析能力。下面是Pyspark和Hive的使用教程: 1. 安装Pyspark:首先需要安装合适版本的SparkPython环境。然后下载并解压Pyspark,并将其添加到Python的环境变量中。 2. 导入pyspark模块:打开Python解释器或者PyCharm等开发环境,在代码中导入pyspark模块。 3. 创建SparkSession:使用以下代码创建一个SparkSession对象,用于连接Spark集群。 ```python from pyspark.sql import SparkSession spark = SparkSession.builder \ .appName("HiveExample") \ .config("spark.sql.warehouse.dir", "/user/hive/warehouse") \ .enableHiveSupport() \ .getOrCreate() ``` 4. 使用Hive表:可以使用Pyspark来操作Hive表。通过spark.sql方法,可以像在Hive中一样执行SQL查询和操作Hive表。 ```python # 创建一个Hive表 spark.sql("CREATE TABLE IF NOT EXISTS my_table (id INT, name STRING)") # 插入数据 spark.sql("INSERT INTO my_table VALUES (1, 'John')") spark.sql("INSERT INTO my_table VALUES (2, 'Amy')") # 查询数据 result = spark.sql("SELECT * FROM my_table") result.show() ``` 5. 执行分析任务:Pyspark和Hive的结合可以用于进行大规模数据的分析任务。利用Pyspark的API,可以实现各种数据处理、转换和分析操作。 ```python # 筛选数据 filtered = spark.sql("SELECT * FROM my_table WHERE id > 1") # 聚合数据 aggregated = spark.sql("SELECT name, COUNT(*) AS count FROM my_table GROUP BY name") # 排序数据 sorted_result = aggregated.orderBy("count", ascending=False) sorted_result.show() ``` 通过上述教程,你可以开始使用Pyspark和Hive进行大规模数据处理和分析任务。掌握了这些基础知识后,你还可以深入学习更多高级的操作和技巧,以提高数据处理和分析的效率和质量。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值