import org.apache.spark.sql.SparkSession import scala.util.Random object TestSortBy { def main(args: Array[String]): Unit = { val spark = SparkSession.builder().appName("app").master("local[*]").getOrCreate() val sc = spark.sparkContext val rdd = sc.parallelize(1 to 100) val radmomRdd = rdd.map(i => i + 34)//增加隨機數 // radmomRdd.sortBy(i => i, true).foreach(i => print(i + ",")) // radmomRdd.sortBy(i => i, true).mapPartitionsWithIndex((idx, iter)=>{ // println("partitionIndex" + idx + " " + iter.mkString(",")) // iter // }).collect() // 0. 直接sortBy,各分區內有序,全局可以看到是無序的 radmomRdd.sortBy(i => i, false).foreach(i => print(i + ",")) println("") // 1. collect方法可以將RDD類型的數據轉化為數組,同時會從遠程集群是拉取數據到driver端。 // 屬於先局部有序,再分區(合成1個區) radmomRdd.sortBy(i => i, false).collect().foreach(i => print(i + ",")) println("") // 2.sortBy()函數的源碼,其本質也是用到了sortByKey()函數 radmomRdd.sortBy(i => i, false,1).foreach(i => print(i + ",")) println("") // 3. radmomRdd.zipWithIndex().sortByKey(false,1).foreach(i => print(i._1 + ",")) println("") // 4.先分區,后局部有序,效率不如上面 //radmomRdd.repartition(1).sortBy(i => i, false).foreach(i => print(i + ",")) } }