我有一个RDD,其中包含“客户”,“花费的AMT”。我正在尝试按“ Amt Spent”进行简单的排序。当我查看结果时,我看到发生了多种排序。
我的代码:
val sc = new SparkContext("local[*]", "TotalSpentByCustomerSorted")
val input = sc.textFile("filename.csv")
val input2 = input.map(line=>line.split(",")).map(
line=>(line(0).toInt,line(2).toFloat)
) // To fetch only customer#, Amt spent
val input3 = input2.reduceByKey((x,y)=>(x+y)).sortBy(x=>x._2)
input3.foreach(println)
结果:
(28,5000.7104)
(22,5019.449)
(29,5032.5303)
(17,5032.6797)
(60,5040.7095)
(45,3309.3804)
(79,3790.5698)
(96,3924.23)
(23,4042.65)
(99,4172.29)
从结果中可以看到,前5个条目是按Amt花费排序的,然后又发生了另一个排序。这里可能是什么问题?
答案 0 :(得分:1)
问题不是排序是否有效,而是您在 RDD 的println()
内调用了foreach
-该操作在所有对象上并行执行分区。
而且,在一个真正的集群上(不是在本地开发环境中),您甚至看不到打印的行,因为这些行会在执行者的 JVM 上发生。>
RDD 已排序,但是如果您不想相信我(那会很聪明),那么您可以在执行之前先执行collect
foreach
,它将首先将所有结果获取到驱动程序,然后打印它们(它将按它们的顺序获取它们)。