GenericWritable を使用して、同じキーの異なる値の型を map-reduce ストリームに実装したいと考えています。たとえば、異なる値の型に対して 2 つのユーザー定義クラスを作成します。ユーザー定義の値クラスの 1 つを次に示します。
public user_def_Value1 extends writableComparable<user_def_Value1> {
private var1;
private var2;
......
public void setAsCopy(user_def_Value1 other) {
var1.set(other.var1);
var2.set(other.var2);
}
......
}
次に、GenericWritable を使用して、2 つのユーザー定義値クラスをマッパーの出力値として使用します。ここに私の GenericWritable 実装があります
public class GenericValue extends GenericWritable {
private static Class<? extends Writable>[] CLASSES = null;
static {
CLASSES = (Class<? extends Writable>[]) new Class[] {
user_def_Value1.class,
user_def_Value2.class
};
}
//this empty initialize is required by hadoop
public GraphCleanGenericValue() {
}
public GraphCleanGenericValue(Writable instance) {
set(instance);
}
@Override
protected Class<? extends Writable>[] getTypes() {
return CLASSES;
}
@Override
public String toString() {
return get().toString();
}
}
私の質問はレデューサー メソッドにあります。values.next() を使用してジェネリック値を取得するとき、このジェネリック値をユーザー定義のクラス インスタンスに変換する方法です。これが reducer() に関する私の実装ですが、安全なダウン キャストかどうかはわかりません。
public void reduce(key, Iterator<GenericValue> values,
OutputCollector<outputKey, outputValue> output, Reporter reporter) throws IOException {
user_def_Value1 temp = new user_def_Value1();
temp.setAsCopy((user_def_Value1) values.next().get());
......
}