【Spark】RDD算子reduceByKey执行原理,以reduceByKey((a, b) => a + b)为例

我们都知道reduceByKey是RDD中常用的聚合操作。那它内部的执行原理是怎么样的呢?

>>data.txt
java
python
php
python
go
scala
java
val lines = sc.textFile("data.txt")
val pairs = lines.map(s => (s, 1))
val counts = pairs.reduceByKey((a, b) => a + b)

这边pairs.reduceByKey((a, b) => a + b)的a和b分别是代表什么呢?

我们换成下面的表达式:

pairs.reduceByKey((a: Int, b: Int) => a + b)

进一步地:

pairs.reduceByKey((accumulatedValue: Int, currentValue: Int) => accumulatedValue + currentValue)

accumulatedValue:累加值 

currentValue:当前值

可以看出a代表的是已经叠加后的值,b代表的是当前的值,要进行的操作是对同一个key值的相加。

再看一个例子:

// collection of the form ("key",1),("key,2),...,("key",20) split among 4 partitions
val rdd =sparkContext.parallelize(( (1 to 20).map(x=>("key",x))), 4)
rdd.reduceByKey(_ + _)
rdd.collect()
> Array[(String, Int)] = Array((key,210))

 甚至还可以简写成 reduceByKey(_ + _)

参考:https://stackoverflow.com/questions/30145329/reducebykey-how-does-it-work-internally?r=SearchResults

 

你可能感兴趣的:(Spark)