【问题标题】:How to include/map calculated percentiles to the result dataframe?如何将计算的百分位数包含/映射到结果数据框?
【发布时间】:2020-06-19 00:55:24
【问题描述】:

我正在使用 spark-sql-2.4.1v,我正在尝试在给定数据的每一列上查找分位数,即百分位数 0、百分位数 25 等。

当我在做多个百分位数时,如何从结果中检索每个计算出的百分位数?

我的数据框df

+----+---------+-------------+----------+-----------+
|  id|     date|      revenue|con_dist_1| con_dist_2|
+----+---------+-------------+----------+-----------+
|  10|1/15/2018|  0.010680705|         6|0.019875458|
|  10|1/15/2018|  0.006628853|         4|0.816039063|
|  10|1/15/2018|   0.01378215|         4|0.082049528|
|  10|1/15/2018|  0.010680705|         6|0.019875458|
|  10|1/15/2018|  0.006628853|         4|0.816039063|
+----+---------+-------------+----------+-----------+

我需要得到预期的输出/结果如下:

+----+---------+-------------+-------------+------------+-------------+
|  id|     date|      revenue| perctile_col| quantile_0 |quantile_10  |
+----+---------+-------------+-------------+------------+-------------+
|  10|1/15/2018|  0.010680705| con_dist_1  |<quant0_val>|<quant10_val>|
|  10|1/15/2018|  0.010680705| con_dist_2  |<quant0_val>|<quant10_val>|
|  10|1/15/2018|  0.006628853| con_dist_1  |<quant0_val>|<quant10_val>|
|  10|1/15/2018|  0.006628853| con_dist_2  |<quant0_val>|<quant10_val>|
|  10|1/15/2018|   0.01378215| con_dist_1  |<quant0_val>|<quant10_val>|
|  10|1/15/2018|   0.01378215| con_dist_2  |<quant0_val>|<quant10_val>|
|  10|1/15/2018|  0.010680705| con_dist_1  |<quant0_val>|<quant10_val>|
|  10|1/15/2018|  0.010680705| con_dist_2  |<quant0_val>|<quant10_val>|
|  10|1/15/2018|  0.006628853| con_dist_1  |<quant0_val>|<quant10_val>|
|  10|1/15/2018|  0.006628853| con_dist_2  |<quant0_val>|<quant10_val>|
+----+---------+-------------+-------------+------------+-------------+

我已经像这样计算了分位数,但需要将它们添加到输出数据框中:

val col_list = Array("con_dist_1","con_dist_2")
val quantiles = df.stat.approxQuantile(col_list, Array(0.0,0.1,0.5),0.0)

val percentile_0 = 0;
val percentile_10 = 1;

val Q0 = quantiles(col_list.indexOf("con_dist_1"))(percentile_0)
val Q10 =quantiles(col_list.indexOf("con_dist_1"))(percentile_10)

如何获得如上所示的预期输出?

【问题讨论】:

  • quant0_valquant10_val 是常量值?
  • 我写了一个函数来一次性计算多列,但我多次用完内存,因为窗口必须为每个变量重新洗牌。最后起作用的是把它们分开,然后再加入。
  • @Shaido - 恢复莫妮卡,嗨莫妮卡,你怎么样?我有一个这样的用例,任何建议请stackoverflow.com/questions/63137437/…

标签: scala apache-spark java-8 apache-spark-sql quantile


【解决方案1】:

一个简单的解决方案是创建多个数据框,每个“con_dist”列一个,然后使用union 将它们合并在一起。这可以使用map 而不是col_list 轻松完成,如下所示:

val col_list = Array("con_dist_1", "con_dist_2")
val quantiles = df.stat.approxQuantile(col_list, Array(0.0,0.1,0.5), 0.0)

val df2 = df.drop(col_list: _*) // we don't need these columns anymore

val result = col_list
  .zipWithIndex
  .map{case (col, colIndex) => 
    val Q0 = quantiles(colIndex)(percentile_0)
    val Q10 = quantiles(colIndex)(percentile_10)

    df2.withColumn("perctile_col", lit(col))
      .withColumn("quantile_0", lit(Q0))
      .withColumn("quantile_10", lit(Q10))
  }.reduce(_.union(_))

最终的数据框将是:

+---+---------+-----------+------------+-----------+-----------+
| id|     date|    revenue|perctile_col| quantile_0|quantile_10|
+---+---------+-----------+------------+-----------+-----------+
| 10|1/15/2018|0.010680705|  con_dist_1|        4.0|        4.0|
| 10|1/15/2018|0.006628853|  con_dist_1|        4.0|        4.0|
| 10|1/15/2018| 0.01378215|  con_dist_1|        4.0|        4.0|
| 10|1/15/2018|0.010680705|  con_dist_1|        4.0|        4.0|
| 10|1/15/2018|0.006628853|  con_dist_1|        4.0|        4.0|
| 10|1/15/2018|0.010680705|  con_dist_2|0.019875458|0.019875458|
| 10|1/15/2018|0.006628853|  con_dist_2|0.019875458|0.019875458|
| 10|1/15/2018| 0.01378215|  con_dist_2|0.019875458|0.019875458|
| 10|1/15/2018|0.010680705|  con_dist_2|0.019875458|0.019875458|
| 10|1/15/2018|0.006628853|  con_dist_2|0.019875458|0.019875458|
+---+---------+-----------+------------+-----------+-----------+

【讨论】:

  • @BdEngineer:我不确定您希望在何处以及如何包含该组。但通常,通过首先创建一个具有唯一标识符的新列(例如,一个名为 range 的列,每个组具有唯一值),可以很容易地按范围分组,请参见此处的示例:stackoverflow.com/questions/48657771/…
猜你喜欢
  • 2016-05-26
  • 1970-01-01
  • 2017-04-26
  • 2013-08-31
  • 1970-01-01
  • 2011-12-29
  • 2013-06-20
  • 1970-01-01
  • 2014-02-08
相关资源
最近更新 更多