前言
spark中有三大数据模型RDD、累加器以及广播变量,其中RDD是重中之重,所以后面我会出一系列专门讲解RDD的文章,今天我们说的也是比较重要的累加器
一 累加器的作用
累加器:又叫分布式共享只写变量
可能现在还不是很理解这是什么意思,那么讲解累加器的作用之前我们先来看一个需求:
我们需要将一个集合中的数据求和,我们可以这样求解(下面所有操作都是在idea代码实现的):
val rdd = sc.makeRDD(List(1,2,3,4))
val i = rdd.reduce(_+_)
println(i)
这样我们完全能够求出最后的结果,但是reduce方法是需要将数据打乱重组的,肯定会进行shuffle操作,这样数据量较大的时候会非常消耗服务器性能的
我们又想如果可以定义一个变量用来存储结果,遍历集合进行累加就行了,因为遍历是不用进行shuffle的
接下来的代码:
var sum = 0
val rdd = sc.makeRDD(List(1,2,3,4))
rdd.foreach(num => {
sum += num
})
println(sum)
满心欢喜的运行后结果却不是我们预想的那样,结果为0
我们在foreach里面打印sum的值却可以看到sum是累加过num的,仔细思考发现因为scala闭包的原因,我们在函数里面调用外部的变量会在其内部也创建相同的变量,所以sum能够传到每个executor执行结果,但是经过计算的sum却不能返回给driver,所以打印的还是我们初始定义的为0的变量sum,如下图: