ApacheSpark Scala:如何在按键分组rdd时保持值的顺序
也许我问的是一个非常基本的问题,对此表示歉意,但我并没有在互联网上找到答案。我已经配对了RDD,希望使用类似于AgragateByKey的东西,并通过一个键连接所有的值。在输入RDD中最先出现的值应该在加总RDD中最先出现ApacheSpark Scala:如何在按键分组rdd时保持值的顺序,scala,apache-spark,rdd,Scala,Apache Spark,Rdd,也许我问的是一个非常基本的问题,对此表示歉意,但我并没有在互联网上找到答案。我已经配对了RDD,希望使用类似于AgragateByKey的东西,并通过一个键连接所有的值。在输入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,它们都给了我输出,但并没有保持值的顺序。
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
确实无法保持顺序-您必须人为地在每条记录中添加一个“提示”,以便您可以在分组后根据该提示进行排序:
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
您可以尝试在聚合后对每个集合重新排序。你试过了吗?我如何重新排序,我不需要id desc或asc。我需要基于输入rdd进行排序。当您使用groupByKey时,您将得到一个rdd[(Int,Iterable[Int]),对吗?然后,您可以使用转换映射RDD值,将它们转换为数组并对该数组进行排序。我相信您希望对值进行排序,而不是对键进行排序,对吗?感谢您的回复,请检查我在问题中提到的输出RDD。输出值不按大于或小于排序,而是按输入RDD中的到达顺序排序。