0

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());
            ......
        }
4

2 に答える 2