Spark rdd:groupByKey 和amp; 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 的函数形参。
这篇好文章是转载于:学新通技术网
- 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
- 本站站名: 学新通技术网
- 本文地址: /boutique/detail/tanhgchhcb
-
photoshop保存的图片太大微信发不了怎么办
PHP中文网 06-15 -
《学习通》视频自动暂停处理方法
HelloWorld317 07-05 -
word里面弄一个表格后上面的标题会跑到下面怎么办
PHP中文网 06-20 -
Android 11 保存文件到外部存储,并分享文件
Luke 10-12 -
photoshop扩展功能面板显示灰色怎么办
PHP中文网 06-14 -
微信公众号没有声音提示怎么办
PHP中文网 03-31 -
excel下划线不显示怎么办
PHP中文网 06-23 -
excel打印预览压线压字怎么办
PHP中文网 06-22 -
TikTok加速器哪个好免费的TK加速器推荐
TK小达人 10-01 -
怎样阻止微信小程序自动打开
PHP中文网 06-13