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

时间:2016-09-22 08:10:30

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

我有以下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

1 个答案:

答案 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