以下是自定義的一個資料型別,有兩個屬性,一個是名稱,一個是開始點(可以理解為單詞和單詞的位置)
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 +"\t"+ 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()); } }