以下是自定义的一个数据类型,有两个属性,一个是名称,一个是开始点(可以理解为单词和单词的位置)
MR程序就不写了,请看WordCount程序。
package cn.genekang.hadoop.mr.RealignerTargetCreator; import java.io.DataInput; import java.io.DataOutput; import java.io.IOException; import org.apache.hadoop.io.WritableComparable; import org.apache.hadoop.io.WritableComparator; public class ReadBean implements WritableComparable<ReadBean> { /** * 自定义的一个数据类型。 * 此数据类型可以作为key,也可以作为value * 如果只作为value的话而且不需要排序的话可以继承自Writable接口。如果需要排序的话就必须实现WritableComparable接口 * 如果作为key的话,还必须要指定以什么作为key,或者说需要告诉shuffle,你的key值是怎么进行比较的。 * 以此,必须要定义一个Comparator的比较类,继承自 WritableComparator,而且要有定义key的比较器 * **/ private String locName; private int readStart; public ReadBean() { // TODO Auto-generated constructor stub } //必须重写此方法,将属性进行序列化处理 @Override public void write(DataOutput out) throws IOException { out.writeUTF(locName); out.writeInt(readStart); } //必须重写此方法,反序列化,得到属性的值 @Override public void readFields(DataInput in) throws IOException { this.locName = in.readUTF(); this.readStart = in.readInt(); } //此方法是重写Object类的,可以不重写 @Override public int hashCode() { return locName.hashCode() * 13 + readStart; } //要想对数据进行排序,必须重写此方法。1为升序,-1为降序,0为相等 @Override public int compareTo(ReadBean o) { if (this.locName.equals(o.getLocName())) { return this.readStart > o.readStart ? 1 : -1; } else { return this.locName.compareTo(o.locName) > 0 ? 1 : -1; } } //必须要重写,指明自定义数据类型的输出格式和输出内容 @Override public String toString() { return this.locName +" "+ this.readStart; } //可以不重写 public boolean equals(ReadBean o) { if (this.locName.equals(o.getLocName()) && this.readStart == o.getReadStart()) { return true; } return false; } //可以使用此方法为自定义数据类型赋值。 public void set(String name, int start) { this.locName = name; this.readStart = start; } public String getLocName() { return locName; } public void setLocName(String locName) { this.locName = locName; } public int getReadStart() { return readStart; } public void setReadStart(int readStart) { this.readStart = readStart; } //定义一个内部的比较类,实现key的比较方法 public static class Comparator extends WritableComparator { public Comparator() { super(ReadBean.class); // TODO Auto-generated constructor stub } @Override public int compare(byte[] arg0, int arg1, int arg2, byte[] arg3, int arg4, int arg5) { return compareBytes(arg0, arg1, arg2, arg3, arg4, arg5); } } //定义一个key的比较器 static { WritableComparator.define(ReadBean.class, new Comparator()); } }