现在的位置: 首页 > 综合 > 正文

Map/Reduce中分区和分组的问题

2013年08月27日 ⁄ 综合 ⁄ 共 833字 ⁄ 字号 评论关闭

一、为什么写

分区和分组在排序中的作用是不一样的,今天早上看书,又有点心得体会,记录一下。

二、什么是分区

1、还是举书上的例子,在8.2.4章节的二次排序过程中,用气温举例,所以这里我也将这个例子说一下。

源数据内容

1900 35°C
1900 34°C
1900 34°C
...
1901 36°C
1901 35°C

书上的例子是为了去除一年当中气温最高的值,那么将年份和气温做了一个复合的key.

2、通过设置了partitioner来进行分区(这里注意了,分区是通过partitioner来进行的)。因为分区是按照年份来进行,所以同年的数据就可以

分区到一个reducer中。但是这样的分区是不能做到对气温划分的,所以分区后的结果如下:

7SG([3$_~JFIOM$6PIRVT6E

上面这个图是书上的,我只是截取下来而已。可以看到,partition实现了年份同一分区,但是不是一个分组。注意看后面的2条竖线,通过截断表示。

3、如果想把同一年份的气温分组到一起,那么需要做分组的控制。在reducer中以年份部分来分组值,那么同一年的记录就会分到同一个reduce组中。

结果如下:

image

注意看一下后面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的输入。

4、写的不对或有错误的地方,可留言或发邮件交流dajuezhao@gmail.com

抱歉!评论已关闭.