package com.elong;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.io.WritableComparable;
import java.io.DataInput;
import java.io.DataOutput;
import java.io.IOException;
/**
* Created by user on 16/3/17.
*/
public class TextPair implements WritableComparable<TextPair> {
private Text first;
private Text second;
public TextPair(){
set(new Text(), new Text());
}
public TextPair(String first,String second){
set(new Text(first),new Text(second));
}
public TextPair(Text first,Text second){
set(first,second);
}
public void set(Text first,Text second){
this.first = first;
this.second = second;
}
public Text getFirst(){
return first;
}
public Text getSecond(){
return second;
}
@Override
public void write(DataOutput out) throws IOException {
first.write(out);
second.write(out);
}
@Override
public void readFields(DataInput in)throws IOException {
first.readFields(in);
second.readFields(in);
}
@Override
public int hashCode(){
return first.hashCode() * 163 + second.hashCode();
}
@Override
public boolean equals(Object o ){
if(o instanceof TextPair){
TextPair tp = (TextPair) o;
return first.equals(tp.first) && second.equals(tp.second);
}
return false;
}
@Override
public String toString(){
return first + "\t" + second;
}
@Override
public int compareTo(TextPair tp){
int cmp = first.compareTo(tp.first);
if(cmp != 0){
return cmp;
}
return second.compareTo(tp.second);
}
}
- 第一部分的实现,有两个Text实例变量,first和second。同时实现constructors,getters,setters。所有的Writable实现必须有一个默认的构造函数,方便MapReduce框架实例化他们,填充他们主要通过调用readFields().Writable实例经常变化和复用,因此应该避免分配对象在write()和readFields()方法中。
- 在Java中写任意的值对象都要求覆盖hashCode(),equals(),toString()方法。由于在reduce时,hashCode()影响分区,所以需要优化这个函数。
- 由于实现了WritableComparable,因此需要提供对compareTo()的实现。