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() } }