Scala 如何在spark数据帧中执行汇总时保持值的顺序

Scala 如何在spark数据帧中执行汇总时保持值的顺序,scala,apache-spark,Scala,Apache Spark,如何对下面的数据帧进行汇总,即只有一条公共键及其值的记录作为元组,并保持值的顺序 我能够进行汇总,但无法维持值的顺序 +------------- | key| val| +------------- | A|4816| | A|5732| | A|5542| | B|5814| | B|5812| | B|5499| | C|5992|

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

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

 +-------------
    |    key| val|
    +-------------
    |      A|4816|
    |      A|5732|
    |      A|5542|
    |      B|5814|
    |      B|5812|
    |      B|5499|
    |      C|5992|
    |      C|7299|
    |      C|5193|
预期O/p

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

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

简单的回答是您不需要。在一般情况下,
数据帧
没有顺序,因此没有什么需要保留的。此外,聚合需要洗牌,因此不保证任何操作的处理顺序

在特定情况下,您可以尝试类似的方法:

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"))

但是使用它的风险由您自己承担,并且只有在您完全理解上游执行计划的保证的情况下使用。

在创建数据帧之前,您必须生成一个新的列进行排序,因为数据帧是分布式的,并且没有排序信息,无法保持顺序。