前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Scala学习(二)groupByKey和reduceByKey

Scala学习(二)groupByKey和reduceByKey

作者头像
张凝可
发布2019-08-22 10:52:37
1.2K0
发布2019-08-22 10:52:37
举报
文章被收录于专栏:技术圈技术圈

大数据处理中有一个典型的例子WordCount,类似与Hello World的作用,map阶段主要是将单词转换为(word,1)的形式,在reduce阶段则是将Key值相同的1累加求和,最终得到的结果就是单词的count数。假设map的结果为(word,(m,n))如果按照key值将对应的列累加起来呢?比如经过map的数据集是这样的("happy",1,3),("hello",2,6),("happy",3,4)如何通过操作获得("happy",4,5),("hello",2,6),本文从这个角度介绍在Spark中pairRDD的两种方法groupByKey和reduceByKey

groupByKey

groupByKey对具有相同键的值进行分组,比如pairRDD={(1,2),(3,2),(1,7)},调用groupByKey的结果为{(1,[2,7]),(3,2)},groupByKey后仍然是pairRDD,只不过k--v中的value值为的Iterator类型。

reduceByKey

合并具有相同键的值,和reduce相同的是它们都接收一个函数,并使用该函数对值进行合并。reduceByKey() 会为数据集中的每个键进行并行的归约操作,每个归约操作会将键相同的值合并起来。因为数据集中可能有大量的键,所以 reduceByKey() 没有被实现为向用户程序返回一个值的行动操作。实际上,它会返回一个由各键和对应键归约出来的结果值组成的新的 RDD。仍然是刚才的那个例子,reduceByKey后获得的结果是{(1,9),(3,2)}.

reduceByKey和groupByKey

其实reduceByKey操作可以通过groupByKey和reduce两个操作达到reduceByKey的效果。通过文章开头提到那个例子分别介绍使用reduceByKey和groupByKey来解决这个问题。

reduceByKey

rdd.reduceByKey((x,y)=>(x._1+y._1,x._2+y._2))

其中reduceByKey方法是聚合类函数,x相当与当前行,y为下一行,通过这个方法可以把具有相同键的值聚合起来。

groupByKey

rdd.groupByKey().mapValue(value=>value.reduce((x,y)=>(x._1+y._1,x._2+y._2)))

对比这两个方法,reduceByKey方法的时间效率更优,但是在一些情况下通过groupByKey在通过mapValue和reduce进行来操作pairRDD更容易控制中间过程。

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2018年03月18日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档