先附上一段代码:
object Test {
def main(args: Array[String]): Unit = {
val conf: SparkConf = new SparkConf().setMaster("local[*]").setAppName("Test")
val sc: SparkContext = new SparkContext(conf)
val array: RDD[Int] = sc.parallelize(List(3,4,1,2))
val unit: RDD[Int] = array.sortBy(x => x)
unit.foreach(println)
sc.stop()
}
}
输出结果:
2
1
4
3
很奇怪,为什么sortBy算子不能对列表进行排序呢?因为sortBy主要是针对分区内排序。在创建SparkConf对象时,我们把setMaster的值设置为了“local[*]”,这会导致列表中的数据分配到不同的分区,因此无法对整个列表排序。
解决办法:
- 将local[*]改为local或local[1]
- 重新分区
object Test {
def main(args: Array[String]): Unit = {
val conf: SparkConf = new SparkConf().setMaster("local[*]").setAppName("Test")
val sc: SparkContext = new SparkContext(conf)
val array: RDD[Int] = sc.parallelize(List(3,4,1,2))
val unit: RDD[Int] = array.repartition(1).sortBy(x => x) // 计算之前将数据发送到同一个分区
unit.foreach(println)
sc.stop()
}
}