算子功能:
减少分区数量,
应用场景:ABC 3个分区分别处理10w条原始数据,但是在处理的筛选的过程中,过滤掉了大部分的数据,此时的ABC3个分区的数据量只有1000条,那么此时还使用原始的3个分区去处理这1000条数据,消耗太多,即可使用coaliesce算子,减少分区的数量
代码如下:
package sparkcore.day01
import org.apache.spark.{SparkConf, SparkContext}
object demo01_coalesc {
def main(args: Array[String]): Unit = {
System.setProperty("hadoop.home.dir", "D:\\spark")
val conf = new SparkConf().setAppName("spakrcore").setMaster("local[*]")
val sc = new SparkContext(conf)
val mkRDD = sc.makeRDD(List(1,2,3,4,5,6),2)
val unit = mkRDD.coalesce(2).saveAsTextFile("output")
sc.stop()
}
}
注意:coalesce 算法默认是不会打乱分区的数据,所以不会重新组合数据,仅仅是缩减了分区,如果想要进行shuffle,将第二个参数设置为true,
1、默认 不进程shuffle 打乱数据的操作
object demo01_coalesc_02 {
def main(args: Array[String]): Unit = {
Logger.getLogger("org").setLevel(Level.ERROR)
System.setProperty("hadoop.home.dir", "D:\\spark")
val conf = new SparkConf().setAppName("spakrcore").setMaster("local[*]")
val sc = new SparkContext(conf)
val mkRDD = sc.makeRDD(List(1,2,3,4,5,6),3)
val unit = mkRDD.coalesce(2).saveAsTextFile("output")
sc.stop()
}
}
分区内的数据分别是
分区1:
1 2
分区2:
3 4 5 6
1、将coalesce 设置为 进程shuffle 打乱数据的操作
分区1数据:
分区2数据:
数据并没有按照1 2 3 在分区1 4 5 6在分区2 ,是因为在coalesce设置shuffle为true的时候,会重新的打乱数据,并且重新将打乱的数据分配到2个分区中