首页 > 代码库 > Hadoop-MapReduce之自定义数据类型

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());    }}

 

Hadoop-MapReduce之自定义数据类型