【发布时间】:2021-06-06 20:33:14
【问题描述】:
如何在 PySpark SQL 中实现用户定义的聚合函数 (UDAF)?
pyspark version = 3.0.2
python version = 3.7.10
作为一个最小的例子,我想用 UDAF 替换 AVG 聚合函数:
sc = SparkContext()
sql = SQLContext(sc)
df = sql.createDataFrame(
pd.DataFrame({'id': [1, 1, 2, 2], 'value': [1, 2, 3, 4]}))
df.createTempView('df')
rv = sql.sql('SELECT id, AVG(value) FROM df GROUP BY id').toPandas()
rv 将在哪里:
In [2]: rv
Out[2]:
id avg(value)
0 1 1.5
1 2 3.5
UDAF 如何替换查询中的AVG?
例如这不起作用
import numpy as np
def udf_avg(x):
return np.mean(x)
sql.udf.register('udf_avg', udf_avg)
rv = sql.sql('SELECT id, udf_avg(value) FROM df GROUP BY id').toPandas()
这个想法是在纯 Python 中实现一个 UDAF,用于处理 SQL 聚合函数(例如低通滤波器)不支持的处理。
【问题讨论】:
-
不,因为自 Spark 3.0 以来
pandas_udf的定义发生了变化
标签: pandas apache-spark pyspark apache-spark-sql user-defined-functions