首页 文章

计算pyspark数据帧列的百分位数

提问于
浏览
0

我有一个PySpark数据框,其中包含一个ID,然后是几个我想要计算95%点的变量 .

printSchema()的一部分:

root
 |-- ID: string (nullable = true)
 |-- MOU_G_EDUCATION_ADULT: double (nullable = false)
 |-- MOU_G_EDUCATION_KIDS: double (nullable = false)

我发现了How to derive Percentile using Spark Data frame and GroupBy in python,但是失败并显示错误消息:

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)

AttributeError:'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()得到一个意外的关键字参数'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 回答

  • 0
    df.selectExpr('percentile(MOU_G_EDUCATION_ADULT, 0.95)').show()
    

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

相关问题