Writableを拡張してみる

SampleWritable.javaを作成

キー部を拡張する場合はWritableComparable、値部を拡張する場合はWritableを実装する

package sample;

import java.io.DataInput;
import java.io.DataOutput;
import java.io.IOException;
import org.apache.hadoop.io.WritableComparable;
import org.apache.hadoop.io.Text;

public class SampleWritable implements WritableComparable<SampleWritable> {

    private String base;
    private char key;

    @Override
    public void readFields(DataInput in) throws IOException {
        base = Text.readString(in);
        key = in.readChar();
    }

    @Override
    public void write(;DataOutput out) throws IOException {
        Text.writeString(out, base);
        out.writeChar(key);
    }

    @Override
    public int compareTo(SampleWritable o) {
        return String.valueOf(key).compareTo(String.valueOf(o.key));
    }

    public void set(String base, String key) {
        this.base = base;
        this.key = key;
    }

    public String getBase() {
        return base;
    }

    public char getKey() {
        return key;
    }
}

利用する際にはクライアント側でsetOutputKeyClassを設定しMapperやReducer側で今までText等で指定した部分をSampleWritableに変更する(ジェネリックス部も含め)

又、通常のOutputFormatクラスを利用する場合には上記のまま行うとクラスのインスタンスハッシュコードが表示されてしまうので、そういう場合においてはtoStringメソッドをオーバーライドしておいて、そこで表示されるテキストの処理を記述してStringで返してあげれば良い