Scala在结果中重复排序

时间:2019-01-18 16:28:00

标签: scala apache-spark

我有一个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花费排序的,然后又发生了另一个排序。这里可能是什么问题?

1 个答案:

答案 0 :(得分:1)

问题不是排序是否有效,而是您在 RDD println()内调用了foreach-该操作在所有对象上并行执行分区。
而且,在一个真正的集群上(不是在本地开发环境中),您甚至看不到打印的行,因为这些行会在执行者的 JVM 上发生。

RDD 已排序,但是如果您不想相信我(那会很聪明),那么您可以在执行之前先执行collect foreach,它将首先将所有结果获取到驱动程序,然后打印它们(它将按它们的顺序获取它们)