计算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与分组后保留最大值行