我想使用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());
......
}
使用'instanceof' – zsxwing