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()。