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"))
我有一个包含 "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"))