先附上一段代碼:
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()
}
}
輸出結(jié)果:
2
1
4
3
很奇怪,為什么sortBy算子不能對(duì)列表進(jìn)行排序呢之拨?因?yàn)閟ortBy主要是針對(duì)分區(qū)內(nèi)排序。在創(chuàng)建SparkConf對(duì)象時(shí),我們把setMaster的值設(shè)置為了“l(fā)ocal[*]”寺滚,這會(huì)導(dǎo)致列表中的數(shù)據(jù)分配到不同的分區(qū),因此無法對(duì)整個(gè)列表排序屈雄。
解決辦法:
- 將local[*]改為local或local[1]
- 重新分區(qū)
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) // 計(jì)算之前將數(shù)據(jù)發(fā)送到同一個(gè)分區(qū)
unit.foreach(println)
sc.stop()
}
}