0

我想使用 GenericWritable 在 map-reduce 流中实现同一键的不同值类型。例如,我为不同的值类型创建了两个用户定义的类,这是我的用户定义的值类之一:

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 将我的两个用户定义的值类作为我的映射器的输出值。这是我的 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();
    }
}

我的问题是在 reducer 方法中,当我使用 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

1

您可以使用instanceof. 例如:

Writable value = values.next().get();
if (value instanceof SomeClassName) {
    // do something;
} 
else if (value instanceof AnotherClassName) {
    // do something;
}
于 2013-09-22T03:54:12.887 回答
0

这个问题实际上与 Hadoop 无关。它是关于在 Java 中做变体类型。大约有8 种方法,它们都不同程度地吸吮。

于 2013-09-22T11:44:59.197 回答