Scala rdd.sortByKey给出了错误的结果

Scala rdd.sortByKey给出了错误的结果,scala,apache-spark,rdd,Scala,Apache Spark,Rdd,我复制了sortByKey的主体并将其重命名为sortByKey 2,但它们给出了不同的结果。为什么第一个结果在这里是错误的?这是在eclipse中运行的。我重新启动了eclipse,但仍然得到了错误的结果 package test.spark import org.apache.spark.sql.SparkSession object RddTests { var spark = SparkSession.builder().appName("rdd-test").master("l

我复制了
sortByKey
的主体并将其重命名为
sortByKey 2
,但它们给出了不同的结果。为什么第一个结果在这里是错误的?这是在eclipse中运行的。我重新启动了eclipse,但仍然得到了错误的结果

package test.spark

import org.apache.spark.sql.SparkSession

object RddTests {
  var spark = SparkSession.builder().appName("rdd-test").master("local[*]")
    .enableHiveSupport()
    .getOrCreate()

  val sc = spark.sparkContext

  def main(args: Array[String]) {
    //mapValues
    //combineWithKey
    //foldByKey
    sortByKey
    sortByKey2
  }    

  def sortByKey() {
    val people = List(("Mobin", 2), ("Mobin", 1), ("Lucy", 2), ("Amy", 1), ("Lucy", 3), ("Lucy", 1))
    val rdd = sc.parallelize(people)
    val sortByKeyRDD = rdd.sortByKey()
    println;println("sortByKeyRDD")
    sortByKeyRDD.foreach(println)
  }

  def sortByKey2() {
    val people = List(("Mobin", 2), ("Mobin", 1), ("Lucy", 2), ("Amy", 1), ("Lucy", 3), ("Lucy", 1))
    val rdd = sc.parallelize(people)
    val sortByKeyRDD = rdd.sortByKey()
    println;println("sortByKeyRDD2")
    sortByKeyRDD.foreach(println)
  }
}
输出为:

[Stage 0:>                                                          (0 + 0) / 4]

sortByKeyRDD
(Mobin,2)
(Mobin,1)
(Amy,1)
(Lucy,2)
(Lucy,3)
(Lucy,1)

sortByKeyRDD2
(Amy,1)
(Mobin,2)
(Mobin,1)
(Lucy,2)
(Lucy,3)
(Lucy,1)

foreach
不保证元素将按任何特定顺序进行处理。如果执行
sortByKeyRDD.collect.foreach(println)
操作,您将按顺序看到结果,尽管这假设您的数据将放入驱动程序内存中

sortByKey
文档中所述:

对结果RDD调用collect或save将返回或输出一个有序的记录列表


[编辑]使用
ToLocalitator
而不是
collect
将驱动程序内存需求限制为最大的单个分区。感谢您在评论中指出这一点。

在此,了解foreach()sortByKey()等方法在spark中的工作原理非常重要

当您尝试对数据进行排序并希望使用foreach(System.out::println)打印输出时,驱动程序会将此方法分发到每个分区(即集群中的节点或单机中的多线程)。因此,每个分区都在本地执行foreach。这意味着您将看不到希望看到的输出

人们建议的可能解决方案,虽然在Bigdata中不是正确的解决方案

以上解决方案仅用于理解目的,我不建议使用它。如果您的数据很大,当它试图在驱动程序上收集所有数据以打印输出时,可能会出现内存不足的异常

sortByKeyRDD.coalesce(1).foreach(System.out::println);
sortByKeyRDD.collect().forEach(System.out::println);