Hadoop (5) - Writable -
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で返してあげれば良い