我有一个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)
不会将包装数组作为输入。
我不知道有一个内置的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()