Scala:按相邻列划分的数据框列的中值 UDF

Scala: Median UDF on Data Frame Column Partitioned by adjacent Columns

我有一个包含 "id"、"Month"、"Day"、"Hour" 和 "value" 列的 DataFrame 我想按 id group/partition , Month 和 Hour 并在 value 列上执行中位数,这样我就有了每个月每小时的每日中位数。我有一个可以计算中位数的 UDF:

def medianCalculator(seq: Seq[Int]): Int = {
  val sortedSeq = seq.sortWith(_ < _)

  if (seq.size % 2 == 1) sortedSeq(sortedSeq.size / 2)
  else {
    val (up, down) = sortedSeq.splitAt(seq.size / 2)
    (up.last + down.head) / 2
  }
}

取自here

我可以将其应用于整列并使用以下方法获得结果:

val output = df.select("value").collect().flatMap(_.toSeq).toSeq.map(_.toString.toInt)

但是,我无法确定按 "id"、"Month" 和 "Hour" 以及 returns "value" 的中位数划分一次的方法 grouped/partitioned 在新的专栏中。

编辑:

在上面添加了 "Day" 列并评论了每个月的每日每小时中位数。

您的问题没有太多内容可以继续,但这里有几行可以为您指明正确的方向。

val medianUDF = udf(medianCalculator)

val output = df
  .groupBy($"id", $"Month", $"Hour")
  .agg(collect_list($"value").as("values"))
  .select($"id", $"Month", $"Hour", medianUDF($"values"))