在Pyspark数据框中计算百分位数

7
我有一个PySpark数据框,其中包含一个ID,然后是一些变量,我想计算95%点。 printSchema()的一部分:
root
 |-- ID: string (nullable = true)
 |-- MOU_G_EDUCATION_ADULT: double (nullable = false)
 |-- MOU_G_EDUCATION_KIDS: double (nullable = false)

我发现了如何在Python中使用Spark Data frame和GroupBy推导百分位数,但是它出现了错误信息。
perc95_udf = udf(lambda x: x.quantile(.95))


fanscores = genres.withColumn("P95_MOU_G_EDUCATION_ADULT", perc95_udf('MOU_G_EDUCATION_ADULT')) \
                      .withColumn("P95_MOU_G_EDUCATION_KIDS", perc95_udf('MOU_G_EDUCATION_KIDS'))

fanscores.take(2) 

属性错误:'float'对象没有'quantile'属性

我已经尝试过的其他UDF测试:

def percentile(quantiel,kolom):
    x=np.array(kolom)
    perc=np.percentile(x, quantiel)
    return perc

percentile_udf = udf(percentile, LongType())


fanscores = genres.withColumn("P95_MOU_G_EDUCATION_ADULT", percentile_udf(quantiel=95, kolom=genres.MOU_G_EDUCATION_ADULT)) \
                  .withColumn("P95_MOU_G_EDUCATION_KIDS", percentile_udf(quantiel=95, kolom=genres.MOU_G_EDUCATION_KIDS))

fanscores.take(2)   

出现错误:“TypeError: wrapper() got an unexpected keyword argument 'quantiel'”
我的最后一次尝试:
import numpy as np

def percentile(quantiel):
    return udf(lambda kolom: np.percentile(np.array(kolom), quantiel))

fanscores = genres.withColumn("P95_MOU_G_EDUCATION_ADULT", percentile(quantiel=95)(genres.MOU_G_EDUCATION_ADULT)) \
                  .withColumn("P95_MOU_G_EDUCATION_KIDS", percentile(quantiel=95) (genres.MOU_G_EDUCATION_KIDS))

fanscores.take(2)  

出现错误:
PickleException: 期望构造 ClassDict(对于 numpy.dtype)的零个参数
我该如何解决?
1个回答

15
df.selectExpr('percentile(MOU_G_EDUCATION_ADULT, 0.95)').show()

对于大型数据集,考虑使用 percentile_approx()


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接