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

che*_*ens 7 dataframe apache-spark apache-spark-sql pyspark

我有以下Spark数据帧:

 agent_id|payment_amount|
+--------+--------------+
|       a|          1000|
|       b|          1100|
|       a|          1100|
|       a|          1200|
|       b|          1200|
|       b|          1250|
|       a|         10000|
|       b|          9000|
+--------+--------------+
Run Code Online (Sandbox Code Playgroud)

我的欲望输出会是这样的

agen_id   95_quantile
  a          whatever is 95 quantile for agent a payments
  b          whatever is 95 quantile for agent b payments
Run Code Online (Sandbox Code Playgroud)

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

test_df.groupby('agent_id').approxQuantile('payment_amount',0.95)
Run Code Online (Sandbox Code Playgroud)

但我采取以下错误:

'GroupedData' object has no attribute 'approxQuantile'
Run Code Online (Sandbox Code Playgroud)

我需要在新列中具有.95分位数(百分位数),以便稍后可用于过滤目的

我使用的是Spark 2.0.0

eli*_*sah 13

一种解决方案是使用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|
# +--------+-----------------+ 
Run Code Online (Sandbox Code Playgroud)

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

注2: approxQuantile在Spark <2.0中不可用pyspark.

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

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