apache-spark - 在 PySpark 数据帧上使用 groupBy 计算百分位数

标签 apache-spark pyspark apache-spark-sql median percentile

我正在尝试groupBy,然后计算 PySpark 数据帧上的百分位数。我根据 this Stack Overflow 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()

但出现以下错误:

Traceback (most recent call last): > df_out.show() ....> return lambda *a: f(*a) AttributeError: 'module' object has no attribute 'percentile'

这是因为numpy版本(1.4.1),从1.5版本开始添加了百分位数函数。短期内不可能更新numpy版本。

最佳答案

定义一个窗口并使用内置的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))

关于apache-spark - 在 PySpark 数据帧上使用 groupBy 计算百分位数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53785697/

相关文章:

apache-spark - 如何在 spark 2.4.1 中将 jdbc/partitionColumn 类型设置为 Date

python - pyspark使用lambda内的正则表达式分割字符串

python - 连接两个 PySpark 数据帧

scala - 将列表转换为数据帧 Spark scala

scala - 在范围内找不到 Spark 隐式编码器

hadoop - 使用 Apache Spark 多次插入到表中

hadoop - yarn模式提交spark应用时出现异常

apache-spark - java.lang.NoClassDefFoundError : Could not initialize class org. xerial.snappy.Snappy

hadoop - 使用 pyspark,在 h​​adoop 文件系统上读/写 2D 图像

mongodb - 如何使用来自 MongoDB 的过滤记录构建 Spark 数据框?