【问题标题】:Serialization in Hadoop - WritableHadoop 中的序列化 - 可写
【发布时间】:2013-06-21 05:41:20
【问题描述】:

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

谢谢!!!

【问题讨论】:

  • 你需要考虑它不是线程安全的。
  • 专业小贴士:如果您要问很多 questions here,尤其是在 Hadoop 等不那么拥挤的主题上(比 C# 和 Java 不那么拥挤),请确保您投票并接受您previously asked 的问题的答案。如果你不这样做,你很快就会对社区失去同情。

标签: serialization hadoop writable


【解决方案1】:

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

是的,你没有抓住重点。如果需要构造一个Test的实例并填充atoms,那么你需要给Test添加一个构造函数:

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

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

不要打电话给readFieldswrite;当 Hadoop 框架需要序列化和反序列化与 mapreduce 之间的输入和输出时,它会为您执行此操作。

【讨论】:

  • 永远不要忘记默认构造函数 ;-)
  • @Thomas Jungblut:那时他不能设置atoms(所以他要么需要一个让他这样做的构造函数,要么需要一个二传手)。不过,我会做一个小编辑。谢谢。
  • 非常感谢 Jason 和 Thomas!这有帮助!!另外,感谢您在上面发布问题的提示:) 我对这个网站很陌生。
猜你喜欢
  • 2018-11-10
  • 2015-02-20
  • 2018-06-01
  • 2013-05-26
  • 2016-03-13
  • 1970-01-01
  • 2022-01-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多