Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
ApacheSpark Scala:如何在按键分组rdd时保持值的顺序_Scala_Apache Spark_Rdd - Fatal编程技术网

ApacheSpark Scala:如何在按键分组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,它们都给了我输出,但并没有保持值的顺序。

也许我问的是一个非常基本的问题,对此表示歉意,但我并没有在互联网上找到答案。我已经配对了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,它们都给了我输出,但并没有保持值的顺序。因此,请提出这方面的建议。

因为
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中的到达顺序排序。