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 + ",")) } }