• 首页 首页 icon
  • 工具库 工具库 icon
    • IP查询 IP查询 icon
  • 内容库 内容库 icon
    • 快讯库 快讯库 icon
    • 精品库 精品库 icon
    • 问答库 问答库 icon
  • 更多 更多 icon
    • 服务条款 服务条款 icon

Spark rdd:groupByKey 和amp; reduceByKey 区别

武飞扬头像
南风知我意丿
帮助2

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
系列文章
更多 icon
同类精品
更多 icon
继续加载