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);