我有以下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'
我需要在新列中使用.95分位数(百分位数),以便以后可以用于过滤目的
我正在使用Spark 2.0.0
答案 0 :(得分:11)
一种解决方案是使用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&lt; < 2.0 pyspark
。
注3: percentile
返回组中数字列(包括浮点类型)的近似第p个百分位数。当col中的不同值的数量小于第二个参数值时,这将给出精确的百分位值。
编辑: Spark 2 + ,不需要HiveContext
。