首页 > 代码库 > Map/Reduce中分区和分组的问题
Map/Reduce中分区和分组的问题
全篇结论
【分在同一组的<key,value>一定同属一个分区。在一个分区的<key,value>可重载"job.setGroupingComparatorClass(a.class);"中的a类的
compare方法重新定义分组规则,同一组的value做为reduce的输入。】
一、为什么写
分区和分组在排序中的作用是不一样的,今天早上看书,又有点心得体会,记录一下。
二、什么是分区
1、还是举书上的例子,在8.2.4章节的二次排序过程中,用气温举例,所以这里我也将这个例子说一下。
源数据内容
1900 35°C1900 34°C1900 34°C...1901 36°C1901 35°C书上的例子是为了去除一年当中气温最高的值,那么将年份和气温做了一个复合的key.
2、通过设置了partitioner来进行分区(这里注意了,分区是通过partitioner来进行的)。因为分区是按照年份来进行,所以同年的数据就可以
分区到一个reducer中。但是这样的分区是不能做到对气温划分的,所以分区后的结果如下:
上面这个图是书上的,我只是截取下来而已。可以看到,partition实现了年份同一分区,但是不是一个分组。注意看后面的2条竖线,通过截断表示。
3、如果想把同一年份的气温分组到一起,那么需要做分组的控制。在reducer中以年份部分来分组值,那么同一年的记录就会分到同一个reduce组中。
结果如下:
注意看一下后面2条竖线,和上面的对比,分区和分组相同,那么在reduce输出的时候,只需要取第一个value就能达到输出一年最高气温的目的。
三、总结
1、以上内容是对hadoop全文指南的二次排序的个人理解,可能写的比较晦涩,建议看看8.4.2这个章节。
2、分区和分组是不同的概念,并且进行的阶段也是不同的。
3、一般来说,想要做到分区和分组的排序,key一般都是复合的组合(例如年份和气温构成了key)。
4、分在同一组的<key,value>一定同属一个分区。在一个分区的<key,value>可重载"job.setGroupingComparatorClass(a.class);"中的a类的
compare方法重新定义分组规则,同一组的value做为reduce的输入。