本文章向大家介绍Spark中的coalesce算子和repartition算子,主要包括coalesce和repartition的区别和使用场景、应用技巧。附带知识点总结,有需要的进来了解一下吧。
一、coalesce
函数签名
def coalesce(numPartitions: Int, shuffle: Boolean = false, // 默认false不执行shuffle
partitionCoalescer: Option[PartitionCoalescer] = Option.empty)
(implicit ord: Ordering[T] = null) : RDD[T]
功能说明
coalesce算子缩减分区数,用于大数据集过滤后,提高小数据集的执行效率。
需求说明
将3个分区合并为2个分区(不执行Shuffle过程)。
object value08_coalesce {
def main(args: Array[String]): Unit = {
//1 创建SparkConf并设置App名称
val conf: SparkConf = new SparkConf().setAppName("SparkCoreTest").setMaster("local[*]")
//2 创建SparkContext,该对象是提交Spark App的入口
val sc: SparkContext = new SparkContext(conf)
//3 创建一个RDD
val rdd: RDD[Int] = sc.makeRDD(Array(1, 2, 3, 4, 5, 6), 3)
//3.1 缩减分区 默认不执行Shuffle
val coalesceRDD: RDD[Int] = rdd.coalesce(2)
//4 查看对应分区数据
coalesceRDD.mapPartitionsWithIndex(
(index, datas) => {
datas.map((index + "号分区", _))
}
).collect().foreach(println)
//5 关闭连接
sc.stop()
}
}
代码运行截图:
注意:coalesce算子包括执行Shuffle和不执行Shuffle两种方式。
执行Shuffle方式如下:
//1 创建一个RDD
val rdd: RDD[Int] = sc.makeRDD(Array(1, 2, 3, 4, 5, 6), 3)
//2 执行shuffle 参数设置为 true
val coalesceRdd: RDD[Int] = rdd.coalesce(2, true)
二、repartition
函数签名
def repartition(numPartitions: Int)(implicit ord: Ordering[T] = null): RDD[T]
功能说明
repartition算子内部其实执行的是coalesce操作,Shuffle的默认值为true。无论是将分区数多的RDD转换为分区数少的RDD,还是将分区数少的RDD转换为分区数多的RDD,repartition操作都可以完成,因为无论如何都会经过Shuffle过程。
需求说明
创建一个3个分区的RDD,对其重新分区。
object value09_repartition {
def main(args: Array[String]): Unit = {
//1 创建SparkConf并设置App名称
val conf: SparkConf = new SparkConf().setAppName("SparkCoreTest").setMaster("local[*]")
//2 创建SparkContext,该对象是提交Spark App的入口
val sc: SparkContext = new SparkContext(conf)
//3 创建一个RDD
val rdd: RDD[Int] = sc.makeRDD(Array(1, 2, 3, 4, 5, 6), 3)
//3.1 重新分区
val repartitionRdd: RDD[Int] = rdd.repartition(4)
//4 打印查看对应分区数据
repartitionRdd.mapPartitionsWithIndex(
(index, datas) => {
datas.map((index + "号分区", _))
}
).collect().foreach(println)
//5 关闭连接
sc.stop()
}
}
运行结果截图:
三、总结
coalesce算子执行重新分区可以选择是否进行Shuffle过程。由Shuffle的参数决定,一般用于缩减分区。
repartition算子实际上是调用的coalesce,进行Shuffle过程(源码如下),一般用于扩大分区。
def repartition(numPartitions: Int)(implicit ord: Ordering[T] = null): RDD[T] = withScope {
coalesce(numPartitions, shuffle = true)
}
coalesce一般为缩减分区,如果扩大分区,不使用Shuffle是没有意义的,repartition用于扩大分区。