MapReduce的分区 与 分组
2016-03-29 11:45
274 查看
原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 、作者信息和本声明。否则将追究法律责任。http://computerdragon.blog.51cto.com/6235984/1287721
问题描述:
输入文件格式如下:
name1 2
name3 4
name1 6
name1 1
name3 3
name1 0
要求输出的文件格式如下:
name1 0,1,2,6
name3 3,4
要求是按照第一列分组,name1与name3也是按照顺序排列的,组内升序排序。
思路:
常规的输出,无法排序key所对应的多个值的顺序。为了排序组内中的值,需要将key与value放在同一个组。Job中有两个方法setGroupingComparatorClass和setSortComparatorClass,可以利用这两个方法来实现组内排序。但是这些排序都是基于key的,则就要将key和value定义成组合键。
但是必须要保证第一列相同的全部都放在同一个分区中,则就需要自定义分区,分区的时候只考虑第一列的值。由于partitioner仅仅能保证每一个reducer接受同一个name的所有记录,但是reducer仍然是通过键进行分组的分区,也就说该分区中还是按照键来分成不同的组,还需要分组只参考name值
先按照name分组,再在name中内部进行排序。
解决方法:
运用自定义组合键的策略,将name和1定义为一个组合键。在分区的时候只参考name的值,即继承partitioner。
由于要按照name分组,则就需要定义分组策略,然后设置setGroupingComparatorClass。
setGroupingComparatorClass主要定义哪些key可以放置在一组,分组的时候会对组合键进行比较,由于这里只需要考虑组合键中的一个值,则定义实现一个WritableComparator,设置比较策略。
对于组内的排序,可以利用setSortComparatorClass来实现,
这个方法主要用于定义key如何进行排序在它们传递给reducer之前,
这里就可以来进行组内排序。
具体代码:
Hadoop版本号:hadoop1.1.2
自定义组合键
分组策略
组内排序策略
分区策略
MapReduce策略
注意事项
1,设置分组排序按照升序还是降序是在自定义WritableComparable中的compareTo()方法实现的,具体升序或者降序的设置在代码中已经注释说明
2,设置组内值进行升序还是降序的排序是在组内排序策略中的compare()方法注释说明的。
3,这里同时最重要的一点是,将第二列即放在组合键中,又作为value,这样对于组合键排序也就相当于对于value进行排序了。
4,在自定义组合键的时候,对于组合键中的数据的基本类型可以采用Java的基本类型也可以采用Hadoop的基本数据类型,对于Hadoop的基本数据类型一定要记得初始化new一个基本数据类型对象。对于组合键类,必须要有默认的构造方法。
本文出自 “在云端的追梦” 博客,请务必保留此出处http://computerdragon.blog.51cto.com/6235984/1287721
问题描述:
输入文件格式如下:
name1 2
name3 4
name1 6
name1 1
name3 3
name1 0
要求输出的文件格式如下:
name1 0,1,2,6
name3 3,4
要求是按照第一列分组,name1与name3也是按照顺序排列的,组内升序排序。
思路:
常规的输出,无法排序key所对应的多个值的顺序。为了排序组内中的值,需要将key与value放在同一个组。Job中有两个方法setGroupingComparatorClass和setSortComparatorClass,可以利用这两个方法来实现组内排序。但是这些排序都是基于key的,则就要将key和value定义成组合键。
但是必须要保证第一列相同的全部都放在同一个分区中,则就需要自定义分区,分区的时候只考虑第一列的值。由于partitioner仅仅能保证每一个reducer接受同一个name的所有记录,但是reducer仍然是通过键进行分组的分区,也就说该分区中还是按照键来分成不同的组,还需要分组只参考name值
先按照name分组,再在name中内部进行排序。
解决方法:
运用自定义组合键的策略,将name和1定义为一个组合键。在分区的时候只参考name的值,即继承partitioner。
由于要按照name分组,则就需要定义分组策略,然后设置setGroupingComparatorClass。
setGroupingComparatorClass主要定义哪些key可以放置在一组,分组的时候会对组合键进行比较,由于这里只需要考虑组合键中的一个值,则定义实现一个WritableComparator,设置比较策略。
对于组内的排序,可以利用setSortComparatorClass来实现,
这个方法主要用于定义key如何进行排序在它们传递给reducer之前,
这里就可以来进行组内排序。
具体代码:
Hadoop版本号:hadoop1.1.2
自定义组合键
1,设置分组排序按照升序还是降序是在自定义WritableComparable中的compareTo()方法实现的,具体升序或者降序的设置在代码中已经注释说明
2,设置组内值进行升序还是降序的排序是在组内排序策略中的compare()方法注释说明的。
3,这里同时最重要的一点是,将第二列即放在组合键中,又作为value,这样对于组合键排序也就相当于对于value进行排序了。
4,在自定义组合键的时候,对于组合键中的数据的基本类型可以采用Java的基本类型也可以采用Hadoop的基本数据类型,对于Hadoop的基本数据类型一定要记得初始化new一个基本数据类型对象。对于组合键类,必须要有默认的构造方法。
本文出自 “在云端的追梦” 博客,请务必保留此出处http://computerdragon.blog.51cto.com/6235984/1287721
相关文章推荐
- Hadoop_2.1.0 MapReduce序列图
- vivi下重新调整分区
- 逻辑卷管理(LVM) Linux 用户指南
- 建议的服务器分区办法
- 建议的分区办法
- 恢复主引导分区
- SQLServer 通用的分区增加和删除的算法
- Windows Powershell排序和分组管道结果
- SQL进行排序、分组、统计的10个新技巧分享
- C#判断指定分区是否是ntfs格式的方法
- mysql分表和分区的区别浅析
- php下几个常用的去空、分组、调试数组函数
- ThinkPHP分组下自定义标签库实例
- 阿里云主机Windows 2008服务器硬盘分区和格式化图文教程
- ThinkPHP独立分组使用的注意事项
- mysql 将字段time按天/月/年分组
- MongoDB中的MapReduce简介
- MongoDB学习笔记之MapReduce使用示例
- MongoDB学习笔记之分组(group)使用示例
- MongoDB中MapReduce编程模型使用实例