如何在spark Dataframe中进行汇总时维护值的顺序

Arj*_*jun 2 scala apache-spark

如何汇总下面的数据帧,即只有公共密钥的单个记录及其作为元组的值并保持值的顺序.

我可以进行汇总但不能维持值的顺序.

 +-------------
    |    key| val|
    +-------------
    |      A|4816|
    |      A|5732|
    |      A|5542|
    |      B|5814|
    |      B|5812|
    |      B|5499|
    |      C|5992|
    |      C|7299|
    |      C|5193|
Run Code Online (Sandbox Code Playgroud)

预期的O/P.

key | val
A   | (4816, 5732, 5542)
B   | (5814, 5812, 5499)
C   | (5992, 7299, 5193)
Run Code Online (Sandbox Code Playgroud)

在进行汇总时如何维护值的顺序?

小智 6

简短的回答是你没有.在一般情况下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"))
Run Code Online (Sandbox Code Playgroud)

但只有在您完全理解上游执行计划的保证时才使用它,风险自负.