我需要计算在一组操作后的数字字段上有一个火花分位数。有没有办法在聚合列表而不是列上应用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...]
答案 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|
+---+---+---+-----+-----+-----------------+