我正在构建一个 map reduce 作业管道(一个 MR 作业的输出作为输入馈送到另一个作业)。传递的值相当复杂,因为存在不同类型的列表和带有值作为列表的哈希映射。Hadoop api 似乎没有 ListWritable。我正在尝试编写一个通用类型,但似乎我无法在我的 readFields 实现中实例化一个通用类型,除非我传入类类型本身:
public class ListWritable<T extends Writable> implements Writable {
private List<T> list;
private Class<T> clazz;
public ListWritable(Class<T> clazz) {
this.clazz = clazz;
list = new ArrayList<T>();
}
@Override
public void write(DataOutput out) throws IOException {
out.writeInt(list.size());
for (T element : list) {
element.write(out);
}
}
@Override
public void readFields(DataInput in) throws IOException{
int count = in.readInt();
this.list = new ArrayList<T>();
for (int i = 0; i < count; i++) {
try {
T obj = clazz.newInstance();
obj.readFields(in);
list.add(obj);
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
}
}
}
但是 hadoop 要求所有可写对象都有一个无参数构造函数来读回值。有没有人尝试做同样的事情并解决了这个问题?TIA。