repartition和coalesce区别,怎么选择,你清楚吗

本文章向大家介绍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用于扩大分区。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值