说明
将分区 合并 或 扩大 到指定的数量
底层通过 coalesce算子 实现,但 repartition 算子使用 更简单,推荐使用本算子
底层实现
底层调用 coalesce算子 ,并将参数 shuffle 设置为 true,所以,肯定会 洗牌(shuffle) 打乱各个分区的数据
所以,无论是合并、扩大,repartition 都可以完成,因为肯定 洗牌(shuffle) 打乱数据,各个分区的数据都是 均衡的
应用场景
合并分区
当大数据集 过滤后,可能数据量会小很多,此时不需要那么多分区,此时 可以通过 repartition 方法,合并分区,减少分区的个数,减小任务调度成本
扩大分区
当数据量大,分区数量少时,就 增大分区数量,每个分区的数据量就少了,提高并行计算能力
例子
扩大分区
val sparConf = new SparkConf().setMaster("local[*]").setAppName("RDD")
val sc = new SparkContext(sparConf)
//此时指定只有2个分区
val rdd:RDD[Int] = sc.makeRDD(List(1,2,3,4,5,6),2)
//设置3个分区
val resRDD: RDD[Int] = rdd.repartition(3)
resRDD.saveAsTextFile("res")
sc.stop()
执行结果:将2个分区中的数据,重新洗牌、均衡放到 3个分区中
合并分区
val sparConf = new SparkConf().setMaster("local[*]").setAppName("RDD")
val sc = new SparkContext(sparConf)
//此时指定只有3个分区
val rdd:RDD[Int] = sc.makeRDD(List(1,2,3,4,5,6),3)
//设置2个分区
val resRDD: RDD[Int] = rdd.repartition(2)
resRDD.saveAsTextFile("res")
sc.stop()
执行结果:将3个分区中的数据,重新洗牌、均衡放到 2个分区中

