Я хочу использовать 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());
......
}
Используйте 'instanceof' – zsxwing