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

时间:2016-09-02 08:14:05

标签: scala apache-spark rdd

可能是我要求非常基本的问题道歉,但我没有在互联网上找到答案。我已配对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,两者都给了我输出,但是没有保持值的顺序。所以请在此提出建议。

1 个答案:

答案 0 :(得分:1)

由于groupByKeyaggregateByKey确实无法保留顺序 - 您必须人为地为每条记录添加“提示”,以便您可以在分组后通过该提示进行排序:

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