双精度数组的近似分位数 - 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()
我有一个 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()