treeAggregate和Aggregate的区别

本文详细解析了Spark中aggregate函数的工作原理及其实现过程,并通过具体示例对比了aggregate与treeAggregate的区别,展示了这两种方法在实际应用中的表现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

我们先来看一下定义:

aggregate(zeroValue:U)(seqOp:(U,T)=>U,combOp:(U,U)=>U)
zeroValue:U,    初始值,比如空列表{}
seqOp:(U,T)=>U,   seq操作符,描述如何将T合并入U,比如如何将item合并到列表
combOp:(U,U)=>U,  comb操作符,描述如何合并两个U,比如合并两个列表

再看应用实例:【aggregate】

def seq(a:Int,b:Int):Int={
  println("seq:"+a+":"+b)
  math.min(a,b)}

 

def comb(a:Int,b:Int):Int={
  println("comb:"+a+":"+b)
  a+b}

def main(args: Array[String]): Unit = {
  val conf = new SparkConf().setAppName("test_aggregate").setMaster("local")
  val sc = new SparkContext(conf)
  val z =sc.parallelize(List(1,2,4,5,8,9),3)
  z.aggregate(3)(seq,comb)
}

      seq:3:4 //3 分区1

      seq:3:1 //1 分区1

       seq:1:2 //1 分区1

       seq:3:8 //3 分区2

       seq:3:5 //3 分区2

       seq:3:9 //3 分区2

       comb:3:1

       comb:4:3

       comb:7:3 //aggregate,两个分区,但是加了三次初值(3)

       res0: Int = 10

【treeAggregate】

       scala> def seq(a:Int,b:Int):Int={

            | println("seq:"+a+":"+b)

            | math.min(a,b)} seq: (a: Int, b: Int)Int

       scala> def comb(a:Int,b:Int):Int={

            | println("comb:"+a+":"+b)

            | a+b} comb: (a: Int, b: Int)Int

       val z =sc.parallelize(List(1,2,4,5,8,9),3)

       scala> z.treeAggregate(3)(seq,comb)

       seq:3:4   //3 分区1
        seq:3:1   //1 分区1
        seq:1:2   //1 分区1
        seq:3:8   //3 分区2
        seq:3:5   //3 分区2
        seq:3:9   //3 分区3
        comb:1:3 comb:4:3

       res1: Int = 7 由上可见,形式上两种用法一致,只是aggregate 比 treeAggregate在最后结果的reduce操作时,多使用了一次初始值。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值