Apache Spark Scala:如何在按键分组 rdd 时保持值的顺序

Apache Spark Scala : How to maintain order of values while grouping rdd by key

可能我问的是非常基本的问题,对此我深表歉意,但我没有在互联网上找到它的答案。我已经配对 RDD 想要使用类似 aggragateByKey 的东西并通过一个键连接所有值。在输入 RDD 中首先出现的值应该在聚合 RDD 中首先出现。

Input RDD [Int, Int]
 2 20
 1 10
 2 8
 2 25

Output RDD (Aggregated RDD)
2 20 8 25
1 10

我尝试了 aggregateByKey 和 gropByKey,两者都给我输出,但值的顺序没有保持。所以请在这方面提出一些建议。

由于 groupByKeyaggregateByKey 确实无法保留顺序 - 您必须人为地向每条记录添加一个 "hint" 以便您可以在分组后自行根据该提示进行排序:

val input = sc.parallelize(Seq((2, 20), (1, 10), (2, 8), (2, 25)))

val withIndex: RDD[(Int, (Long, Int))] = input
  .zipWithIndex()  // adds index to each record, will be used to order result
  .map { case ((k, v), i) => (k, (i, v)) } // restructure into (key, (index, value))

val result: RDD[(Int, List[Int])] = withIndex
  .groupByKey()
  .map { case (k, it) => (k, it.toList.sortBy(_._1).map(_._2)) } // order values and remove index