Hadoop-MapReduce之自定义数据类型

以下是自定义的一个数据类型,有两个属性,一个是名称,一个是开始点(可以理解为单词和单词的位置)
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());
    }

}

 

posted @ 2014-10-31 18:17  林六天  阅读(313)  评论(0编辑  收藏  举报