• 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 +"	"+ 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());
        }
    
    }
  • 相关阅读:
    iOS 字体
    接口继承和实现继承的区别
    实验楼实验——LINUX基础入门
    试看看能不能发布
    mysql binlog恢复
    percona
    ssh2 php扩展
    sphinx
    ngios
    socketlog
  • 原文地址:https://www.cnblogs.com/6tian/p/4065732.html
Copyright © 2020-2023  润新知