MapReduce二次排序实现 博客分类: hadoop hadoop排序
程序员文章站
2024-03-15 10:30:53
...
最近在学习使用原生的mapreduce来实现对值的排序。以前使用scalding可以很容易的得到结果。现在靠自己的时候,就非常的犯难呢。参考权威指南里的方法:使用的是自定义的key来实现。
原因是hadoop只支持key上的排序。因此,我们可以自定义一种复合的key,并同时定义这个key的比较方法(重载compareTo方法)。以下是这个key的一种实现:
如果在某些情况下,我们希望调用另外的key类比较实现,那么可以额外定义一个comparator,并重载compare方法。代码如下: 根据compareTo方法显示,这个IntPair试图实现对second的值先进行升序排列,如果值相同,则进行first值的排序。以上的代码请注意toString方法是用来输出时调用的。否则无法正确打印这个key。在进入map的输出阶段时,会默认调用Key类的compareTo方法进行排序。
注意:
在构造函数的时候使用super(IntPair.class,true)。如果第二个参数为false或者使用super(IntPair.class)则会导致空指针异常。
原因是hadoop只支持key上的排序。因此,我们可以自定义一种复合的key,并同时定义这个key的比较方法(重载compareTo方法)。以下是这个key的一种实现:
public class IntPair implements WritableComparable<IntPair>{ public Text first; public IntWritable second; public IntPair(){ super(); this.set(new Text(),new IntWritable()); } public IntPair(String key, int value){ super(); this.set(key,value); } public void set(Text key,IntWritable value){ this.first=key; this.second=value; } public void set(String key,int value){ this.first=new Text(key); this.second = new IntWritable(value); } @Override public void write(DataOutput out) throws IOException { this.first.write(out); this.second.write(out); } @Override public void readFields(DataInput in) throws IOException { this.first.readFields(in); this.second.readFields(in); } @Override public int compareTo(IntPair o) { int value1= this.second.get(); int value2= o.second.get(); if(value1==value2){ return this.first.compareTo(o.first); }else{ return value1-value2; //升序排列 ,反过来就是降序排列 } } @Override public boolean equals(Object o) { if (o instanceof IntPair) { return this.first.equals(((IntPair) o).first)&&(this.second.equals(((IntPair) o).second)); } else { return false; } } @Override public String toString() { return this.first+"\t"+this.second; } @Override public int hashCode() { return first.toString().hashCode() + second.toString().hashCode(); } }
如果在某些情况下,我们希望调用另外的key类比较实现,那么可以额外定义一个comparator,并重载compare方法。代码如下: 根据compareTo方法显示,这个IntPair试图实现对second的值先进行升序排列,如果值相同,则进行first值的排序。以上的代码请注意toString方法是用来输出时调用的。否则无法正确打印这个key。在进入map的输出阶段时,会默认调用Key类的compareTo方法进行排序。
注意:
在构造函数的时候使用super(IntPair.class,true)。如果第二个参数为false或者使用super(IntPair.class)则会导致空指针异常。
推荐阅读
-
MapReduce二次排序实现 博客分类: hadoop hadoop排序
-
学习Hadoop权威指南之Hadoop运行MapReduce日志查看 博客分类: hadoop hadoop大数据
-
MapReduce输入输出格式 博客分类: hadoop HadoopMapReduce大数据
-
冒泡排序算法实现与分析 博客分类: 数据结构与算法 算法java冒泡排序
-
使用python实现8大排序算法-冒泡排序 博客分类: python python排序算法冒泡排序
-
冒泡排序的两种实现方法(Java) 博客分类: 算法与数据结构 冒泡排序时间复杂度空间复杂度
-
hadoop-->mapreduce编程统计手机流量并排序
-
MapReduce 从作业、任务(task)、管理员角度调优 博客分类: 自学记录HaDoop学习笔记 mapreduce调优hadoop操作系统调优hadoop硬件调优
-
32位hadoop编译实现与64位操作系统兼容 博客分类: 自学记录HaDoop学习笔记 hadop编译mavengcc
-
hadoop作业的优化常用手段 博客分类: HaDoop学习笔记自学记录 mapreduce作业调优手段