Hadoop-MapReduce之自定義資料型別

林六天發表於2014-10-31
以下是自定義的一個資料型別,有兩個屬性,一個是名稱,一個是開始點(可以理解為單詞和單詞的位置)
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());
    }

}

 

相關文章