Spark RDD之 sortBy如何全局排序?

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


  }
}
原文地址:https://www.cnblogs.com/sabertobih/p/13792372.html