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]),整个操作的执行流程如下:
- 0+1,0+1
- 1+2,1+1
- 3+3,2+1
- 6+4,4+1
最后返回的结果为(10,4),如果考虑分布式条件下,driver将num分为三个RDD:{1,2},{3},{4},则各分区计算的结果分别为(3,2),(3,1),(4,1),再用combOp操作将三个分区的结果整合起来,同样得到最终结果(10,4)
本文详细介绍了Spark中的reduce()、fold()和aggregate()函数,重点讨论了它们在处理RDD时的不同之处。reduce要求元素同类型,fold在reduce基础上增加了初始值设定,而aggregate则支持异构类型,通过seqOp和combOp两个函数实现分区元素聚合和全局结果整合。通过实例代码解释了这三个函数的工作流程和应用场景。
:reduce、fold和aggregate的区别&spm=1001.2101.3001.5002&articleId=79491197&d=1&t=3&u=a035c0c0f90644f3858cd26e00bc4940)
439

被折叠的 条评论
为什么被折叠?



