可写的收集问题

时间:2014-03-10 02:23:45

标签: java hadoop mapreduce

在阅读Hadoop, the definitive guide的书时,我发现了以下段落。在我看来,标有黄色的代码段是标记为绿色的方案的示例。

我不清楚为什么我们必须super(Text.class);,以及代码的哪一部分显示我们“静态设置类型”,标记为红色。

enter image description here

2 个答案:

答案 0 :(得分:0)

  1. 如果你检查ArrayWritable(超类);它有下面的构造函数,这就是我们必须使用super

    设置类型的原因

    ArrayWritable(Class valueClass)

  2. 静态意味着我们已经完成了这个编译时间(编译器必须在编译时而不是在运行时知道这一点)

答案 1 :(得分:0)

问题,以及Hadoop最糟糕的事情之一是所有(输入和输出格式,键,值,映射器,缩减器,组合器,分区器,比较器......)使用反射构造,假设提供的类具有0-arg构造函数。这意味着你不能只使用ArrayWritable作为键或值的类,因为没有0-arg构造函数,Hadoop可以使用它来实例化该类型的键或值。通过创建像TextArrayWritable这样的普通子类,使用0-arg构造函数,可以解决这个恼人的限制。这是一个有点奇怪的“静态”使用;构造函数仍然在运行时设置元素类型,即使它是常量。