这是实现Writable的类。
public class Test implements Writable {
List<AtomicWritable> atoms = new ArrayList<AtomicWritable>();
public void write(DataOutput out) throws IOException {
IntWritable size = new IntWritable(atoms.size());
size.write(out);
for (AtomicWritable atom : atoms)
atom.write(out);
}
public void readFields(DataInput in) throws IOException {
atoms.clear();
IntWritable size = new IntWritable();
size.readFields(in);
int n = size.get();
while(n-- > 0) {
AtomicWritable atom = new AtomicWritable();
atom.readFields(in);
atoms.add(atom);
}
}
}
如果能帮助我了解如何调用write和readFields方法,我将非常感激。 基本上我在这种情况下无法理解如何构造Test对象。一旦将对象写入DataOutput obj,我们如何在DataInput对象中恢复它。这可能听起来很愚蠢,但我是Hadoop的新手并且已经分配了一个使用Hadoop的项目。请帮忙。
感谢!!!
答案 0 :(得分:0)
是的,你错过了这一点。如果您需要构建基本上我在这种情况下无法理解如何构造
Test
对象。
Test
的实例并填充atoms
,那么您需要向Test
添加构造函数:
public Test(ArrayList<AtomicWritable> atoms) {
this.atoms = atoms;
}
或者您需要使用默认构造函数并添加方法或设置器,以便将项目添加到atoms
或设置atoms
的值。后者实际上在Hadoop框架中很常见,有一个默认的构造函数和一个set
方法。参见,例如,Text.set
。
您不致电readFields
和write
;当Hadoop框架需要对map
和reduce
之间的输入和输出进行序列化和反序列化时,Hadoop框架会为您做到这一点。