我熟悉使用UDF逐行将自定义函数应用于DataFrame . 但是,我想知道如何将自定义函数并行应用于我的DataFrame的不同子集 .
这是一个简化的例子:
import numpy as np
import pandas as pd
dummy_data = pd.DataFrame({'id':np.random.choice(['a','b','c'],size=100),
'val':np.random.normal(size=100)})
我的自定义函数将一组数字作为输入 . 对于每个唯一的'id',我想将我的函数应用于与该id相关联的'val'值数组 .
我现在正在做的简单方法是遍历我的PySpark DataFrame,并为每个'id'将数据转换为pandas DataFrame,然后应用该函数 . 它有效,但显然它很慢并且不使用火花 .
我该如何平行?
1 回答
这个答案很短,应该是一个评论,但没有足够的声誉来评论 .
Spark 2.3引入了大熊猫矢量化UDF,它正是您所需要的:通过分布式方式在分组的Spark DataFrame上执行自定义pandas转换,并且由于PyArrow序列化而具有出色的性能 .
看到
https://databricks.com/blog/2017/10/30/introducing-vectorized-udfs-for-pyspark.html
http://spark.apache.org/docs/latest/api/python/pyspark.sql.html?pyspark.sql.functions.pandas_udf#pyspark.sql.functions.pandas_udf
Using Collect_set after exploding in a groupedBy object in Pyspark
了解更多信息和示例 .