开发者学堂课程【大数据Spark2020最新课程(知识精讲与实战演练)第二阶段:RDD 算子_转换_ foldByKey】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/689/detail/11974
RDD 算子_转换_ foldByKey
内容介绍
一、前言
二、区别
三、案例
四、总结
一、前言
前面我们了解了一个算子叫做 reduceByKey ,那么接下来,我们将了解一个跟它几乎一模一样的算子叫做 foldByKey 。
二、区别
foldByKey 和 reduceByKey 最大的区别就在于 foldByKey 有一个初始值,而 reduceByKey 初始值就为零。
那什么是初始值?
如图所示,对于 RDD 来说,如果对它进行 reduceByKey ,那么结果肯定是(“a”,2)。如果指定了初始值为10,可能得到的结果为22。第一项的初始值可以指定为10,10和1相加是11。第二项我也指定一个初始值,相加后也是11。那么这两个的初始值再加上具体的值,最终结果是22。这就是 foldByKey 和 reduceByKey 最大的区别。
三、案例
接下来我们用一个小小的案例加深下理解。这个案例也是将(“a”,1)
聚和,即 key 与 zerovalue 聚合,只是这次指定了一个初始值。
第一步,先将集合拷贝进入到代码当中,创建一个新的方法。这个 fold 的意思是折叠,那么我们快速的把这个代码写完,就是foldByKey ,它的调用方式希望大家还记得,它里面有两个函数可调用。第一个函数里面传入初始值,第二个函数传入聚合规则。
这也是两个参数,第一个参数是 curr ,第二个参数是局部结果 (agg) ,然后是两者相加。接下来,我们就可以直接 collect ,然后foreach(print)
Test
def foldByKey()
:Unit = {
sc.parallelize(Seq(("a",1),("a",1)("b",1)))
.foldByKey(zerovalue=10)((curr,agg) => curr + agg)
.collect()
.foreach(println(_))
}
此时,代码已经完成,运行一下,看一看 foldByKey 的结果。首先,是有两个 key ,那么第一个 key 的结果应该是多少?
初始值是10,那么结果是12,还是22,答案是 a为22,b为11。也就是说,这个初始值会作用于每一个元素,而不是在整体上作用一次,这个和 Scala 当中的 fold 操作还是有一点点区别,需要大家注意一下。
四、总结
简单总结一下,首先是 foldByKey 和 Spark 中的 reduceByKey 区别是可以指定初始值, foldByKey 和 Scala 中的 foldLeft 或者 foldRight 区别是初始值作用于每一个数据,而 Scala 当中只作用一次,就是整体上指定一个初始值,但是 foldByKey 是为每一条数据设定一个初始值。