Spark rdd之groupByKey & reduceByKey 区别

groupByKey 和 reduceByKey 有什么区别?

从这两个算子的字面意思来看,groupByKey 是先按照 key 进行分组,然后把相同的 key 收集到一起;reduceByKey( f ),把相同的 key 进行聚合,聚合的逻辑由传入 f 函数所指定。

这两个算子,只针对 kv 格式的 RDD 才能使用。在前几篇文章中说了,每调一个算子,都是一次 RDD 的转换,也是一次数据形态的转换。

既然有 RDD 的转换,那么就会有数据依赖形成。下面分别来看看它们所形成的数据依赖图。

1 reduceByKey

我们先来温习下,下面这段代码,这是我从 wordcount 中截取的代码,带你们重新熟悉下 reduceByKey 的用法。

//生成 kv 格式的 RDD
val kvRDD: RDD[(String, Int)] = wordsRDD.map(word=>{new Tuple2(word,1)})

       
//把相同的单词作为一组,并计算
val reduceRDD: RDD[(String, Int)] = kvRDD.reduceByKey((v1, v2)=>{v1+v2},2)

这里最重要的就是 (v1, v2)=>{v1+v2} 匿名函数,在 reduceByKey 中,我们管这个函数叫聚合函数。

因为要把相同的 key 的数据进行聚合,所以会产生 Shuffle,但是会在 Map 端默认开启 combine() 。

会先在 Map 端调用 mapPartitions 进行 map 端聚合,然后通过 shuffle 把数据拉到指定节点上得到 shuffleRDD,再进行 reduce 端聚合,其数据依赖图如下:

图片

值得提醒的是:在 map 端的聚合和 reduce 端的聚合统一由聚合函数 f 指定。

2 groupByKey

我们通过下面这个代码片段,熟悉下 groupByKey 的用法。

//把相同的数字作为一组,并收集
val reduceRDD: RDD[(Int, String)] = kvRDD.groupByKey(2)

从上述用法来看,相较于 rduceByKey ,groupByKey 的实现会简单一点,只需要把相同的 key 进行分组再收集。把相同 key 的数据进行 shuffle 到一个节点上,然后通过mapPartitions() 把相同 key 的数据放在一个集合里并返回。

groupByKey 没有在 Map 端进行 combine() ,因此,在数据量较大的情况下,其性能会比较差,实际生产环境使用较少。这里我通过一个简单案例,给大家画了一个 groupByKey 数据依赖图:

在这里插入图片描述

groupByKey 和 reduceByKey 区别:

reduceByKey 是一个分组聚合类算子,在 Map 端默认开启聚合,且聚合逻辑必须与 Reduce 端一致,即由传进来聚合函数 f 指定;

groupByKey 是一个分组收集类算子,在 Map 端不会产生 combine() ,只是把相同的 key 的数据进行收集到一起,不会接收类似 f 的函数形参。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值