对于sortBy算子的一些理解

package day03

import org.apache.spark.{SparkConf, SparkContext}

/**
  * RanagePartitioner采用的是"水塘抽样"算法,可以对数据进行相对均匀的分配
  * 原理是,.在分配之前对数据进行抽样
  *
  * 与hashPartitioner不同的是,hashPartitioner是根据key取HashCode值进行分区,但是这种分区方式
  * 不能均匀的分配数据,是Spark的默认分区方式
  *
  * RanagePartitioner:可以根据范围进行分区,可以均匀的分配数据,分区内有序,全局无序
  * 如果需要实现全局有序,需要将数据收集到Driver端进行输出
  */
object RanagePartitioner {
  def main(args: Array[String]): Unit = {
    val conf = new SparkConf().setAppName("RanagePartitioner").setMaster("local[*]")
    val sc =new SparkContext(conf)

    val list =Array(1,22,3,4,5,90,66,55,87,34,22,99)
    val numbers=sc.parallelize(list)

    //局部有序,全局有序
    val result =numbers.sortBy(x=>x)
    //定义一个函数变量
    val func =(index:Int,it:Iterator[Int])=>{
      println(s"index:${index}, ele:${it.toList.mkString(",")}")
      it
    }
    val result2=result.mapPartitionsWithIndex(func)
    //收集到Driver端
    result2.collect().foreach(println(_))
    sc.stop()
  }
}