Scala学习(二)groupByKey和reduceByKey

大数据处理中有一个典型的例子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更容易控制中间过程。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值