spark reduceByKey && groupByKey

reduceBykey是一个transformation 算子

reduceByKey:   使用 func 函数合并具有相同键的值。对于每个key对应的多个value进行了merge操作,最重要的是它能够先在本地进行merge操作。merge可以通过func自定义。

 

groupByKey : 对每个key对应的多个value进行操作,但是只是汇总生成一个sequence(返回值是一个(key,iterable[])),本身不能自定义函数,只能通过额外通过map(func)来实现。

 

在词频统计中,reduceByKey可以实现词频的累加统计,groupByKey也可以实现,下面展示2种实现方法

val data:RDD[String]=spark.sparkContext.textFile(datapath)
data.flatMap(x=>x.split(" ")).map((_,1)).reduceByKey(_+_).collect().foreach(println(_))

 

val data:RDD[String]=spark.sparkContext.textFile(datapath)
data.flatMap(x=>x.split(" ")).map((_,1)).groupByKey().map(x=>(x._1,x._2.toList.sum)).foreach(println(_))

 

使用reduceByKey()的时候,本地的数据先进行merge然后再传输到不同节点再进行merge,最终得到最终结果。

而使用groupByKey()的时候,并不进行本地的merge,全部数据传出,得到全部数据后才会进行聚合成一个sequence,

groupByKey()传输速度明显慢于reduceByKey()。

posted @ 2021-01-04 16:21  bioamin  阅读(120)  评论(0编辑  收藏  举报