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

Approx quantile on a array of doubles - Spark dataframe

我有一个 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) 不将包装数组作为输入。

我不知道 built-in 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()