自定义Writable

package com.elong;

import org.apache.hadoop.io.Text;
import org.apache.hadoop.io.WritableComparable;

import java.io.DataInput;
import java.io.DataOutput;
import java.io.IOException;

/**
 * Created by user on 16/3/17.
 */
public class TextPair implements WritableComparable<TextPair> {

    private Text first;
    private Text second;


    public TextPair(){
        set(new Text(), new Text());
    }

    public TextPair(String first,String second){
        set(new Text(first),new Text(second));
    }
    public TextPair(Text first,Text second){
        set(first,second);
    }

    public void set(Text first,Text second){
        this.first = first;
        this.second = second;
    }

    public  Text getFirst(){
        return first;
    }

    public Text getSecond(){
        return second;
    }

    @Override
    public  void write(DataOutput out) throws IOException {
        first.write(out);
        second.write(out);
    }

    @Override
    public void readFields(DataInput in)throws  IOException {
        first.readFields(in);
        second.readFields(in);
    }

    @Override
    public int hashCode(){
        return first.hashCode() * 163 + second.hashCode();
    }


    @Override
    public boolean equals(Object o ){
        if(o instanceof TextPair){
            TextPair tp = (TextPair) o;
            return first.equals(tp.first) && second.equals(tp.second);
        }
        return false;
    }



    @Override
    public String toString(){
        return first + "\t" + second;
    }


    @Override
    public int compareTo(TextPair tp){
        int cmp = first.compareTo(tp.first);
        if(cmp != 0){
            return cmp;
        }
        return second.compareTo(tp.second);
    }
}
  • 第一部分的实现,有两个Text实例变量,first和second。同时实现constructors,getters,setters。所有的Writable实现必须有一个默认的构造函数,方便MapReduce框架实例化他们,填充他们主要通过调用readFields().Writable实例经常变化和复用,因此应该避免分配对象在write()和readFields()方法中。
  • 在Java中写任意的值对象都要求覆盖hashCode(),equals(),toString()方法。由于在reduce时,hashCode()影响分区,所以需要优化这个函数。
  • 由于实现了WritableComparable,因此需要提供对compareTo()的实现。
posted @ 2016-03-17 16:19  dalu610  阅读(433)  评论(0编辑  收藏  举报