Hadoop中的序列化 - 可写

时间:2013-06-21 05:41:21

标签: serialization hadoop writable

这是实现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的项目。请帮忙。

感谢!!!

1 个答案:

答案 0 :(得分:0)

  

基本上我在这种情况下无法理解如何构造Test对象。

是的,你错过了这一点。如果需要构建Test的实例并填充atoms,那么您需要向Test添加构造函数:

public Test(ArrayList<AtomicWritable> atoms) {
     this.atoms = atoms;
}

或者您需要使用默认构造函数并添加方法或设置器,以便将项目添加到atoms或设置atoms的值。后者实际上在Hadoop框架中很常见,有一个默认的构造函数和一个set方法。参见,例如,Text.set

不致电readFieldswrite;当Hadoop框架需要对mapreduce之间的输入和输出进行序列化和反序列化时,Hadoop框架会为您做到这一点。