在双精度数组上的近似分位数 - Spark数据帧

问题描述 投票:1回答:1

我有一个spark数据帧定义为:

+----------------+--------------------+-----------+
|        id      |            amt_list|ct_tran_amt|
+----------------+--------------------+-----------+
|1               |[2.99, 7.73, 193....|         23|
|2               |[9.99, 9.95, 5.0,...|         17|
|3               |[4.57, 14.06, 0.7...|         19|

如何计算近似分位数(第1和第3)作为新列?

df.stat.approxQuantile("amt",Array(0.25,0.75), 0.001)不会将包装数组作为输入。

scala apache-spark spark-dataframe quantile
1个回答
1
投票

我不知道有一个内置的spark函数来做这个,所以我会选择一个UDF:

def calcPercentile(perc:Double) = udf((xs:Seq[Double]) => xs.sorted.apply(((xs.size-1)*perc).toInt))

df
  .withColumn("QT1", calcPercentile(0.25)($"amt_list"))
  .withColumn("QT3", calcPercentile(0.75)($"amt_list"))
  .show()

编辑:

还有一种没有UDF的方法:

df
  .withColumn("Q1", sort_array($"amt_list")(((size($"amt_list")-1)*0.25).cast("int")))
  .withColumn("Q3", sort_array($"amt_list")(((size($"amt_list")-1)*0.75).cast("int")))
  .show()
© www.soinside.com 2019 - 2024. All rights reserved.