MapReduce二次排序实现

[size=medium] 最近在学习使用原生的mapreduce来实现对值的排序。以前使用scalding可以很容易的得到结果。现在靠自己的时候,就非常的犯难呢。参考权威指南里的方法:使用的是自定义的key来实现。

原因是hadoop只支持key上的排序。因此,我们可以自定义一种复合的key,并同时定义这个key的比较方法(重载compareTo方法)。以下是这个key的一种实现:[/size]

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();
}
}


[size=medium] 如果在某些情况下,我们希望调用另外的key类比较实现,那么可以额外定义一个comparator,并重载compare方法。代码如下: 根据compareTo方法显示,这个IntPair试图实现对second的值先进行升序排列,如果值相同,则进行first值的排序。以上的代码请注意toString方法是用来输出时调用的。否则无法正确打印这个key。在进入map的输出阶段时,会默认调用Key类的compareTo方法进行排序。

[color=red][b]注意:[/b][/color]
在构造函数的时候使用super(IntPair.class,true)。如果第二个参数为false或者使用super(IntPair.class)则会导致空指针异常。[/size]
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值