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

    }



}

 

你可能感兴趣的:(mapreduce)