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

时间:2018-04-05 18:56:57

标签: scala apache-spark spark-dataframe quantile

我有一个定义为:

的火花数据帧
+----------------+--------------------+-----------+
|        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)不会将包装数组作为输入。

1 个答案:

答案 0 :(得分: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()