私はジョブの 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 では、値を読み戻すために、すべての書き込み可能オブジェクトに引数なしのコンストラクターが必要です。誰かが同じことを試みて、この問題を解決しましたか? ティア。