设为首页 收藏本站
查看: 738|回复: 0

[经验分享] MapReduce二次排序实现

[复制链接]

尚未签到

发表于 2016-12-8 09:29:42 | 显示全部楼层 |阅读模式
最近在学习使用原生的mapreduce来实现对值的排序。以前使用scalding可以很容易的得到结果。现在靠自己的时候,就非常的犯难呢。参考权威指南里的方法:使用的是自定义的key来实现。
    原因是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)则会导致空指针异常。

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.iyunv.com/thread-311305-1-1.html 上篇帖子: hadoop的一些名词解释 下篇帖子: Hadoop MapReduce表关联
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表