重新分区算子coalesce和repartition

coalesce

说明

  • 包括shuffle和不发生shuffle两种方式。
  • 主要用于缩减分区,大数据集过滤后,提高小数据集的执行效率。

函数签名

在这里插入图片描述

代码示例

    val conf: SparkConf = new SparkConf().setAppName(this.getClass.getName).setMaster("local[*]")
    val sc = new SparkContext(conf)
    val rdd: RDD[Int] = sc.makeRDD(1 to 10, 3)
    println("-----------------分区前--------------------")
    rdd.mapPartitionsWithIndex{
      (index, datas) => {
        println(index + "--->" + datas.mkString(","))
        datas
      }
    }.collect()
    println("-----------------分区后--------------------")
    //shuffle参数默认为false,此时缩减分区有效
    /*val newRDD: RDD[Int] = rdd.coalesce(2)
    newRDD.mapPartitionsWithIndex{
      (index, datas) => {
        println(index + "--->" + datas.mkString(","))
        datas
      }
    }.collect()*/
    //shuffle参数默认值为false,此时增大分区数无效,还是原来的分区数
    val newRDD: RDD[Int] = rdd.coalesce(4)
    newRDD.mapPartitionsWithIndex{
      (index, datas) => {
        println(index + "--->" + datas.mkString(","))
        datas
      }
    }.collect()

    sc.stop()

repartition

说明

  • 底层调用的其实是coalesce,但是会发生shuffle。无论是分区数减少的操作,还是分区数增加的操作,repartition都能完成。

函数签名

在这里插入图片描述

代码示例

    val conf: SparkConf = new SparkConf().setAppName(this.getClass.getName).setMaster("local[*]")
    val sc = new SparkContext(conf)
    val rdd: RDD[Int] = sc.makeRDD(1 to 10, 2)
    println("-----------------分区前--------------------")
    rdd.mapPartitionsWithIndex{
      (index, datas) => {
        println(index + "--->" + datas.mkString(","))
        datas
      }
    }.collect()
    println("-----------------分区后--------------------")
    val newRDD: RDD[Int] = rdd.repartition(3)
    newRDD.mapPartitionsWithIndex{
      (index, datas) => {
        println(index + "--->" + datas.mkString(","))
        datas
      }
    }.collect()
    sc.stop()

区别

  • coalesce重新分区,可以选择是否进行shuffle过程。由参数shuffle: Boolean = false/true决定。
  • repartition实际上是调用的coalesce,进行shuffle。
  • coalesce一般为缩减分区,如果扩大分区,不使用shuffle是没有意义的,repartition扩大分区执行shuffle。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值