reducebykey:它的特点是当使用它的时候,这个时候在不同的partition 中的数据会进行简单的combiner。然后再在reduce端进行数据的累加。
groupbykey:当采用它的时候。这个时候他不是对不同的partition中的数据进行combiner。而是直接在最后进行数据的累加。做最后的reduce。
注:借用别人的一段代码:
val words = Array("one", "two", "two", "three", "three", "three")
//下面的代码是对数组中的数据进行简单的转化。把数据转化成pairRDD的形式。
val wordPairsRDD = sc.parallelize(words).map(word => (word, 1))
//下面是进行reducebykey的操作。直接对key相同的进行相加。
val wordCountsWithReduce = wordPairsRDD.reduceByKey(_ + _)
// 下面的操作是对数据进行相加。但是他的操作是分两部分进行操作的。第一步是进行分组。第二步才是进行累加。
val wordCountsWithGroup = wordPairsRDD.groupByKey().map(t => (t._1, t._2.sum))
我在idea里面对这两个效果进行编辑,结果如下:
从这张图当中我们可以看到最终的RDD操作是键对应值的这样的累加形式。直接对相同的key进行累加。
上面这张图是对groupbykey的操作。从中我们可以看出他其实是对pairRDD的一个简单的迭代运算。就像上面所说的他实际在各个partition当中是不会进行
数据的简单的combiner的。而只是一个简单的迭代运算。后面如果还需要进行相同key的一个累加还要做相对应的操作才能完成。
从图中的打印结果我们能够清楚的看出。两者的区别在哪里。
注:在spark2当中使用sparkssion代替了sparkcontext。最后变成了spark。然后将spark转化为sparkcontext。然后将数组当中的数据转化成RDD进行操作。