思考 :
reduceByKey、flodByKey、aggregateByKey、combineByKey 的区别?
本质区别 : Map端聚合和Reduce聚合规则是否相同,是不是要在Map的实现合并器
-
reduceByKey
- 定义
def reduceByKey(partitioner: Partitioner, func: (V, V) => V): RDD[(K, V)] - 操作流程
- 在每个分区节点上将 数据根据key 分组 (相当于Mr中的map方法)
输出 key,iter(value1,value2…) - 在每个分区节点上将 分组后的数据 进行合并 (相当于Mr中的map端合并)
合并流程
输入 : key,iter(value1,value2…)
func(func(value1,value2),value3)… => 聚合结果和value1类型一致
从左往右依次聚合
输出 key,value - 每个分区处理完后, reduce端会拉取处理结果,并对数据根据key 进行reduce操作 (相当于Mr中的reduce方法)
合并流程
输入 : key,iter(value1,value2…)
func(func(value1,value2),value3)…
从左往右依次聚合
输出 key,value - 对处理完的结果数据,根据 指定的分区器,将结果分区(可选)
不指定时,使用默认分区器,分区个数和父Rdd保持一致
- 在每个分区节点上将 数据根据key 分组 (相当于Mr中的map方法)
- note
- reduceByKey相当于Mr程序,开启了Map端合并,且合并规则和reduce规则相同
- reduceByKey 只能将 Rdd[K,V]转换成 Rdd[K,V]
Key、Value的类型不会改变
示例 Rdd[String,Int] reduceByKey
- 定义