【问题标题】:Approx quantile on a array of doubles - Spark dataframe双精度数组的近似分位数 - Spark 数据框
【发布时间】:2023-03-20 16:09:01
【问题描述】:

我有一个 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】:

    我不知道有内置的 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 sql。将数据帧转换为临时视图后 - 使用:val df_t = spark.sql("select id, percentile_approx(amt,0.25) as quantile_1, percentile_approx(amt,0.75) as quantile_3 from df_view group by id")
    • @user1124702 我还添加了一个非UDF解决方案
    • @user1124702 是的,这是一个聚合函数,如果你已经有一个 array 类型的列,这将不再起作用(除非你先将它分解)。 percentile_appox 是一个 hive 内置的聚合函数,在我的经验中相当慢
    • 我明白了。感谢您的建议拉斐尔罗斯!我将使用您的 withColumn 方法。
    猜你喜欢
    • 2020-01-23
    • 2015-07-26
    • 2011-07-07
    • 1970-01-01
    • 1970-01-01
    • 2016-08-27
    • 2017-01-06
    • 1970-01-01
    • 2021-01-05
    相关资源
    最近更新 更多