可能是我要求非常基本的问题道歉,但我没有在互联网上找到答案。我已配对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,两者都给了我输出,但是没有保持值的顺序。所以请在此提出建议。
答案 0 :(得分:1)
由于groupByKey
和aggregateByKey
确实无法保留顺序 - 您必须人为地为每条记录添加“提示”,以便您可以在分组后通过该提示进行排序:
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