说明
将分区 合并 或 扩大 到指定的数量
是 repartition 算子的底层实现
应用场景
合并分区
当大数据集 过滤后,可能数据量会小很多,此时不需要那么多分区,此时 可以通过 coalesce 方法,合并分区,减少分区的个数,减小任务调度成本
扩大分区
当数据量大,分区数量少时,就 增大分区数量,每个分区的数据量就少了,提高并行计算能力
声明
def coalesce(numPartitions: Int, shuffle: Boolean = false,
partitionCoalescer: Option[PartitionCoalescer] = Option.empty)
参数说明:
合并分区:
numPartitions:分区数量,比之前的 rdd分区数量小
shuffle:是否打乱数据并重新组合,默认为 false。
true:打乱数据并重新组合,合并后的分区,每个分区的数据数量是均衡的
false:不会打乱数据并重新组合,将被合并的分区中的数据,直接放到前一个分区中
扩大分区:
numPartitions:分区数量,比之前的 rdd分区数量大
shuffle:打乱数据并重新组合,扩大后,每个分区的数据数量是均衡的。
扩大分区时,必须设置为true,否则不会扩大分区。
合并分区例子
例子 1
val sparConf = new SparkConf().setMaster("local[*]").setAppName("RDD")
val sc = new SparkContext(sparConf)
val rdd:RDD[Int] = sc.makeRDD(List(1,2,3,4,5,6),3)
rdd.saveAsTextFile("res")
val resRDD: RDD[Int] = rdd.coalesce(2)
resRDD.saveAsTextFile("res2")
sc.stop()
执行结果:
合并前:有3个分区,保存成3个文件
合并后:将 第3个分区 中的数据,直接放到 第2个分区 中,没有打乱数据
例子 2
val sparConf = new SparkConf().setMaster("local[*]").setAppName("RDD")
val sc = new SparkContext(sparConf)
val rdd:RDD[Int] = sc.makeRDD(List(1,2,3,4,5,6),3)
rdd.saveAsTextFile("res")
val resRDD: RDD[Int] = rdd.coalesce(2,true)
resRDD.saveAsTextFile("res2")
sc.stop()
执行结果: 打乱数据并重新组合,合并后的分区,其数据 数量是均衡的
扩大分区例子
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)
rdd.saveAsTextFile("res")
//设置3个分区,而且必须要设置true
val resRDD: RDD[Int] = rdd.coalesce(3,true)
resRDD.saveAsTextFile("res2")
sc.stop()
注意: 扩大分区时,必须要设置true,只有 shuffle 后,3个分区才会均衡分配数据,否则第 3 个分区没有数据

