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,两者都给我输出,但值的顺序没有保持。所以请在这方面提出一些建议。
由于 groupByKey
和 aggregateByKey
确实无法保留顺序 - 您必须人为地向每条记录添加一个 "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
可能我问的是非常基本的问题,对此我深表歉意,但我没有在互联网上找到它的答案。我已经配对 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,两者都给我输出,但值的顺序没有保持。所以请在这方面提出一些建议。
由于 groupByKey
和 aggregateByKey
确实无法保留顺序 - 您必须人为地向每条记录添加一个 "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