2013-09-22 2 views
0

Я хочу использовать GenericWritable для реализации различного типа значений одного и того же ключа в потоке уменьшения карты. Например я создаю два определяемые пользователем класса для различного типа значения, вот один из моих пользовательского класса значение:Как восстановить genericWritable для моего пользовательского Writable в сокращении hadoop?

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

мой вопрос в методах редуктора, когда я использую values.next(), чтобы получить общую стоимость, как преобразовать это родовое значение для моего пользовательского экземпляра класса. Вот моя реализация о редукторе(), но я не уверен, что это безопасный гипс.

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

Используйте 'instanceof' – zsxwing

ответ

1

Вы можете использовать instanceof. Например:

Writable value = values.next().get(); 
if (value instanceof SomeClassName) { 
    // do something; 
} 
else if (value instanceof AnotherClassName) { 
    // do something; 
} 
0

Этот вопрос не совсем о Hadoop. Речь идет о вариантах типов в Java. Есть около 8 ways, и все они всасывают в различной степени.

Смежные вопросы