如何在 Spark 数据帧中执行汇总时维护值的顺序



如何汇总下面的数据帧,即只有一条记录将公共键及其值作为元组并保持值的顺序。

我能够进行汇总,但无法保持值的顺序。

+-------------
|    key| val|
+-------------
|      A|4816|
|      A|5732|
|      A|5542|
|      B|5814|
|      B|5812|
|      B|5499|
|      C|5992|
|      C|7299|
|      C|5193|

预期盈利

key | val
A   | (4816, 5732, 5542)
B   | (5814, 5812, 5499)
C   | (5992, 7299, 5193)

如何在执行汇总时保持值的顺序?

简短的回答是你没有。在一般情况下,DataFrames没有订购,因此没有什么可保留的。此外,聚合需要随机排序,因此不保证任何操作的处理顺序。

在特定情况下,您可以尝试类似于以下内容:

import org.apache.spark.sql.functions._
df
.withColumn("id", monotonically_increasing_id)
.groupBy("key")
.agg(collect_list(struct($"id", $"val")).alias("val"))
.select($"key", sort_array($"val").getItem("val").alias("val"))

但使用它的风险自负,并且前提是您完全了解上游执行计划的保证。

最新更新