Spark Dataframe计算阵列上的百分位数

时间:2017-02-01 20:09:41

标签: apache-spark apache-spark-sql

我需要计算在一组操作后的数字字段上有一个火花分位数。有没有办法在聚合列表而不是列上应用approxPercentile?

E.g。 Dataframe看起来像

k1 | k2 | k3 | v1
a1 | b1 | c1 | 879
a2 | b2 | c2 | 769
a1 | b1 | c1 | 129
a2 | b2 | c2 | 323

我需要先运行groupBy (k1, k2, k3)collect_list(v1),然后在v1&#39上列出quantiles [10th, 50th...]

1 个答案:

答案 0 :(得分:4)

你可以在spark sql中使用percentile_approx

假设您的数据位于df,那么您可以执行以下操作:

df.registerTempTable("df_tmp")

val dfWithPercentiles = sqlContext.sql("select k1,k2,k3,percentile_approx(v1, 0.05) as 5th, percentile_approx(v1, 0.50) as 50th, percentile_approx(v1, 0.95) as 95th from df_tmp group by k1,k2,k3")

在您的样本数据上,这会给出:

+---+---+---+-----+-----+-----------------+
| k1| k2| k3|  5th| 50th|             95th|
+---+---+---+-----+-----+-----------------+
| a1| b1| c1|129.0|129.0|803.9999999999999|
| a2| b2| c2|323.0|323.0|            724.4|
+---+---+---+-----+-----+-----------------+