为什么repartitionAndSortWithinPartitions没有排序?

时间:2017-09-14 04:56:57

标签: scala apache-spark

这是我正在做的事情:

val rddkv = sc.parallelize(List(("k1",1),("k2",2),("k1",2),("k3",5),("k3",1)))
    //rddkv.collect
    //Array[(String, Int)] = Array((k1,1), (k2,2), (k1,2), (k3,5), (k3,1))

rddkv.repartitionAndSortWithinPartitions(new org.apache.spark.RangePartitioner(3,rddkv)).mapPartitionsWithIndex( (i,iter_p) => iter_p.map(x=>" index="+i+" value="+x)).collect
    //Array[String] = Array(" index=0 value=(k1,1)", " index=0 value=(k1,2)", " index=1 value=(k2,2)", " index=1 value=(k3,5)", " index=1 value=(k3,1)")

请注意,分区中的值未排序。这是为什么?我错过了什么?

1 个答案:

答案 0 :(得分:1)

RDD实际上是排序的,您可能误解了方法OrderedRDDFunctions.repartitionAndSortWithinPartitions的工作原理。该方法对键值对(K,V)的RDD进行操作,其中K是键,V是值。它将重新分区,然后按键对数据进行排序。

查看输出的顺序:(k1,1), (k1,2), (k2,2), (k3,5), (k3,1),它在键后正确排序。

如果您只想对值进行排序,忽略它们所在的分区,您只需执行rdd.sortBy(_._2)