在sparkDataframe上实现pythonic统计函数

uajslkp6  于 2021-05-27  发布在  Spark
关注(0)|答案(1)|浏览(320)

我在sparkDataframe中有非常大的数据集,分布在节点上。我可以做一些简单的统计,比如 mean , stdev , skewness , kurtosis 使用spark库 pyspark.sql.functions .
如果我想使用高级统计测试,如jarquebera(jb)或shapirowilk(sw)等,我会使用python库,如 scipy 因为标准的apache pyspark库没有它们。但为了做到这一点,我必须将sparkDataframe转换为pandas,这意味着强制数据进入主节点,如下所示:

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

我有多个特性,每个特性id对应于我要在其上执行测试统计的数据集。
我的问题是:
当数据仍然分布在节点上时,有没有方法在sparkDataframe上应用这些pythonic函数,或者我需要在spark中创建自己的jb/sw测试统计函数?
谢谢你的宝贵见解

lsmd5eda

lsmd5eda1#

您应该能够定义一个矢量化的用户定义函数来 Package 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_udf decorator是将其下面定义的函数转换为向量化函数的工具。返回向量的每个元素本身就是一个标量,这就是为什么参数 PandasUDFType.SCALAR 已通过。)

相关问题