learning-spark学习笔记(2):reduce()、fold()和aggregate()的区别

本文详细介绍了Spark中的reduce()、fold()和aggregate()函数,重点讨论了它们在处理RDD时的不同之处。reduce要求元素同类型,fold在reduce基础上增加了初始值设定,而aggregate则支持异构类型,通过seqOp和combOp两个函数实现分区元素聚合和全局结果整合。通过实例代码解释了这三个函数的工作流程和应用场景。

reduce()、fold()和aggregate()都是在spark中对RDD的聚合操作,在理解这几个函数的时候费了一点劲

  • reduce()和fold()要求操作的RDD是同种类型,也就是操作的元素类型和返回的元素类型一致
temp = sc.parallelize([1,2,3,4])
sum = temp.reduce(lambda x, y: x + y)

注意这里x指的是这一个reduce操作的返回值,y是temp list中的元素
fold()和reduce()的区别很少,要求对同类型的RDD操作,同时要求设置初始值作为第一次调用的结果(加法初值是0, 乘法初值是1)

temp = sc.parallelize([1,2,3,4])
sum = temp.fold(0, lambda x, y: x + y)
  • aggregate()支持操作的RDD是不同类型的,即支持异构,比如输入是 Int 类型,输出可以是 (Int,Int)类型

aggregate的官方定义:

Aggregate the elements of each partition, and then the results for all the partitions, using a given combine functions and a neutral “zero value.”

先聚合每个分区类的元素,然后再整合所有分区的结果,需要预先给定的combine函数和初值
官方的函数原型:

def aggregate [U: ClassTag] (zeroValue: U) (seqOp: (U,T)=>U,combOp: (U,U)=>U):U

可以看到,函数要求设置初值 (zeroValue: U) ,并且有两个函数seqOp和combOp
seqOp对应的是聚合分区类元素的操作
combOp对应的是将所有分区的结果整合起来的操作
范例代码:

num = sc.parallelize([1,2,3,4])
seqOp = (lambda x, y: x[0] + y, x[1] + 1)#<===
combOp = (lambda x, y: x[0] + y[0], x[1] + y[1])#<===
sum = num.aggregate((0,0), seqOp, combOp)

被箭头所指的两处困扰了一段时间,其实就像在介绍reduce函数的时候说的,lambda x,y里的x是函数的返回值,y是num list里面的元素([1,2,3,4]),整个操作的执行流程如下:

  1. 0+1,0+1
  2. 1+2,1+1
  3. 3+3,2+1
  4. 6+4,4+1

最后返回的结果为(10,4),如果考虑分布式条件下,driver将num分为三个RDD:{1,2},{3},{4},则各分区计算的结果分别为(3,2),(3,1),(4,1),再用combOp操作将三个分区的结果整合起来,同样得到最终结果(10,4)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值