计算spark Dataframe中分组数据的分位数

Posted

技术标签:

【中文标题】计算spark Dataframe中分组数据的分位数【英文标题】:Calculate quantile on grouped data in spark Dataframe 【发布时间】:2016-09-22 08:10:29 【问题描述】:

我有以下 Spark 数据框:

 agent_id|payment_amount|
+--------+--------------+
|       a|          1000|
|       b|          1100|
|       a|          1100|
|       a|          1200|
|       b|          1200|
|       b|          1250|
|       a|         10000|
|       b|          9000|
+--------+--------------+

我的愿望输出将类似于

agen_id   95_quantile
  a          whatever is 95 quantile for agent a payments
  b          whatever is 95 quantile for agent b payments

对于每组agent_id我需要计算0.95分位数,我采取以下方法:

test_df.groupby('agent_id').approxQuantile('payment_amount',0.95)

但我出现以下错误:

'GroupedData' object has no attribute 'approxQuantile'

我需要在新列中添加 0.95 分位数(百分位数),以便稍后用于过滤目的

我使用的是 Spark 2.0.0

【问题讨论】:

约分位数在 spark 版本 2 下不可用 【参考方案1】:

一种解决方案是使用percentile_approx

>>> test_df.registerTempTable("df")
>>> df2 = sqlContext.sql("select agent_id, percentile_approx(payment_amount,0.95) as approxQuantile from df group by agent_id")

>>> df2.show()
# +--------+-----------------+
# |agent_id|   approxQuantile|
# +--------+-----------------+
# |       a|8239.999999999998|
# |       b|7449.999999999998|
# +--------+-----------------+ 

注意 1: 此解决方案已使用 spark 1.6.2 进行测试,需要HiveContext

注意 2 : approxQuantile 在 Spark pyspark。

注意 3: percentile 返回组中数值列(包括浮点类型)的近似第 p 个百分位数。当 col 中不同值的数量小于第二个参数值时,这将给出一个精确的百分位值。

编辑:来自 Spark 2+HiveContext 不是必需的。

【讨论】:

谢谢,我要测试一下,如果我错了请纠正我,我得到这个错误的原因是 approxQuantile 不是聚合函数? approxQuantile 是一个统计函数,实际上它不是一个聚合函数。 谢谢 1.有没有办法将统计函数应用于数据组? 2. 是否可以创建 Hive 上下文的 python 包装器? 我不确定。我需要先测试一下。如果我在 pyspark 中没记错的话,hiveContext 应该可用,你只需要正确的构建。 @Nabid 检查你的包版本是否兼容(spark包版本必须相同)

以上是关于计算spark Dataframe中分组数据的分位数的主要内容,如果未能解决你的问题,请参考以下文章

薪酬中的分位值是啥意思

R语言使用quantile函数计算评分值的分位数(20%40%60%80%)使用逻辑操作符将对应的分位区间(quantile)编码为分类值生成新的字段strsplit函数将学生的名和姓拆分

Spark Dataframe GroupBy 和计算复杂聚合函数

spark利器2函数之dataframe全局排序id与分组后保留最大值行

大数据Spark DataFrame/DataSet常用操作

大数据Spark DataFrame/DataSet常用操作