2013-09-22 30 views
0

我想使用GenericWritable在map-reduce流中實現同一個鍵的不同值類型。例如我爲不同值的類型的兩個用戶定義的類,這是我的用戶定義值的類中的一個:如何將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()來獲取一個通用的價值,如何將這種通用的值轉換爲我的用戶定義的類的實例。這裏是我關於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()); 
      ...... 
     } 
+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,他們都在不同程度上吸吮。