在pyspark数据帧上使用Groupby计算百分位数

时间:2018-12-14 19:18:57

标签: python apache-spark pyspark apache-spark-sql

我正在尝试groupBy,然后在pyspark数据帧上计算百分位数。我根据以下内容测试了以下代码 到此stackoverflow post

from pyspark.sql.types import FloatType
import pyspark.sql.functions as func
import numpy as np

qt_udf = func.udf(lambda x,qt: float(np.percentile(x,qt)), FloatType())
df_out = df_in.groupBy('Id').agg(func.collect_list('value').alias('data'))\
.withColumn('median', qt_udf(func.col('data'),func.lit(0.5)).cast("string"))  

df_out.show()

但出现以下错误:

  

跟踪(最近一次通话最近):> df_out.show()....>返回lambda * a:f(* a)AttributeError:“模块”对象没有属性“百分位数”

这是因为numpy版本(1.4.1),从版本1.5开始添加了percentile函数。短期内无法更新numpy版本。

1 个答案:

答案 0 :(得分:0)

定义一个窗口并使用内置的percent_rank函数来计算百分位值。

from pyspark.sql import Window
from pyspark.sql import functions as func
w = Window.partitionBy(df_in.Id).orderBy(df_in.value) #assuming default ascending order
df_out = df_in.withColumn('percentile_col',func.percent_rank().over(w))