spark3总结——分区数对带有初始值聚合操作的影响

主题

在sparkRDD的转换操作中,有几个比较特殊的聚合操作,很容易受到分区数的影响,很容易迷惑初学者,比如fold,aggregate等,他们都有初始值zeroValue,在多分区数据集的情况下,初始值的加入和分区数的变化,会导致不同的计算结果。因为他们在分区内部做一次带有zeroValue的聚合后,在对不同分区聚合结果进行合并的时候,会再做一次带有zeroValue的聚合。我们看如下代码

package com.xhc.sparkscala

import org.apache.spark.{SparkConf, SparkContext}

object AggPartitionTest {

  def main(args: Array[String]): Unit = {
    // spark上下文
    val conf = new SparkConf().setAppName("AggPartitionTest").setMaster("local[*]")
    val sc = SparkContext.getOrCreate(conf)
    // 数据
    val data = Array(1, 2, 3, 4, 5)
    // 不同分区数进行聚合
    for (n <- 1 to 3){
      // 分区数据
      val distData = sc.parallelize(data).repartition(n)
      // 打印分区及分区数据
      distData.mapPartitionsWithIndex((idx, items)=>{items.map(x=>(idx, x))}).foreach(println)
      // 计算
      val foldResult = distData.fold(2)((a, b) => a + b)
      val aggResult = distData.aggregate(2)((a, b) => a + b, (c, d) => c + d)
      // 打印计算结果
      println("分区数:%d,fold结果:%d!".format(n, foldResult))
      println("分区数:%d,agg结果:%d!".format(n, aggResult))
    }
  }
}

运行结果如下:

分区及分区数据:
(0,1)
(0,2)
(0,3)
(0,4)
(0,5)
分区数:1,fold结果:19!
分区数:1,agg结果:19!

分区及分区数据:
(1,3)
(0,1)
(1,4)
(0,2)
(0,5)
分区数:2,fold结果:21!
分区数:2,agg结果:21!

分区及分区数据:
(0,4)
(1,2)
(2,1)
(0,5)
(2,3)
分区数:3,fold结果:23!
分区数:3,agg结果:23!

看到了吧!不同的分区会导致不同聚合结果,我们以fold为例,用图来说明一下上例中的计算过
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

aggregate计算过程的分析与此类似噢!!

作者这水平有限,有不足之处欢迎留言指正

  • 4
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 6
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

肥猪猪爸

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值