我熟悉使用 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,然后应用该函数。它有效,但显然它很慢并且没有使用 spark。
我怎样才能将其并行化?
请您参考如下方法:
这个答案太短了,它应该是评论,但没有足够的声誉来评论。
Spark 2.3 引入了 pandas 矢量化 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
获取更多信息和示例。
