提问者:小点点

在spark数据帧上实现pythonic统计函数


我在spark数据帧中有非常大的数据集,这些数据集分布在节点上。我可以使用spark库pyspark>进行简单的统计,如meanstdevskewnesskurtosis等。sql。功能

如果我想使用高级统计测试,如Jarque Bera(JB)或Shapiro Wilk(SW)等,我会使用python库,如scipy,因为标准apache pyspark库没有这些库。但为了做到这一点,我必须将spark数据帧转换为pandas,这意味着强制数据进入主节点,如下所示:

import scipy.stats as stats
pandas_df=spark_df.toPandas()
JBtest=stats.jarque_bera(pandas_df)
SWtest=stats.shapiro(pandas_df)

我有多个特征,每个特征ID对应于我要在其上执行测试统计的数据集。

我的问题是:

当数据仍然分布在节点上时,有没有办法在spark数据帧上应用这些Python函数,或者我需要在spark中创建自己的JB/SW测试统计函数?

谢谢你的宝贵见解


共1个答案

匿名用户

Yous应该能够定义一个包含Pandas函数(https://databricks.com/blog/2017/10/30/introducing-vectorized-udfs-for-pyspark.html)的矢量化用户定义函数,如下所示:

from pyspark.sql.functions import pandas_udf, PandasUDFType
import scipy.stats as stats

@pandas_udf('double', PandasUDFType.SCALAR)

def vector_jarque_bera(x):
    return stats.jarque_bera(x)

# test:
spark_df.withColumn('y', vector_jarque_bera(df['x']))

请注意,矢量化函数列以一列作为其参数,并返回一列。

(注意,@pandas\u udf装饰器将其正下方定义的pandas函数转换为向量化函数。返回向量的每个元素本身就是标量,这就是传递参数PandasUDFType.scalar的原因。)