创建SpecificDatumWriter <t> </t>时出现NullPointerException

时间:2012-03-06 13:38:46

标签: java serialization avro

在Tom White的书“Hadoop:The Definitive Guide”中学习Apache Avro时,我收到了一个错误。

该示例包含3个步骤:

  1. 创建Avro架构文件(Pair.avsc

    {
       "type":"record",
       "name":"Pair",
       "doc":"A pair of strings.",
       "fields":[
          { "name":"left", "type":"string" },
          { "name":"right", "type":"string" }
       ]
    }
    
  2. 使用

    编译模式文件以创建Java类(Pair.java

    $ java -jar $AVRO_HOME/avro-tools-1.6.2.jar compile schema src/main/resources/Pair.avsc src/main/java/

  3. 使用SpecificDatumWriter<Pair>SpecificDatumReader<Pair>序列化/反序列化数据。

  4. 原始示例方法是https://github.com/tomwhite/hadoop-book/blob/master/avro/src/main/java/AvroTest.java中的testPairSpecific()

    我重写了https://github.com/philipjkim/avro-examples/blob/master/src/test/java/org/sooo/AvroTest.java)中的示例代码(createPairAndSerializeThenDeserialize()),这几乎与原始代码相似。不同之处是:

    1. 我使用的Avro版本是1.6.2,原版1.3.2。
    2. avro-tools.jar创建的Pair.java内容不同(原文:https://github.com/tomwhite/hadoop-book/blob/master/avro/src/main/java/Pair.java,我的:https://github.com/philipjkim/avro-examples/blob/master/src/main/java/org/sooo/Pair.java
    3. 运行测试后,出现错误:

      java.lang.NullPointerException
      at java.lang.String.replace(String.java:2228)
      at org.apache.avro.specific.SpecificData.createSchema(SpecificData.java:195)
      at org.apache.avro.specific.SpecificData.getSchema(SpecificData.java:140)
      at org.apache.avro.specific.SpecificDatumWriter.<init>(SpecificDatumWriter.java:33)
      at org.sooo.AvroTest.createPairAndSerializeThenDeserialize(AvroTest.java:86)
          ...
      

      AvroTest.createPairAndSerializeThenDeserialize()是:

      @Test
      public void createPairAndSerializeThenDeserialize() throws IOException {
          // given
          Pair datum = new Pair();
          datum.setLeft(new Utf8("L"));
          datum.setRight(new Utf8("R"));
      
          // serialize
          ByteArrayOutputStream out = new ByteArrayOutputStream();
          DatumWriter<Pair> writer = new SpecificDatumWriter<Pair>(Pair.class); /* Line 86 */
          Encoder encoder = EncoderFactory.get().binaryEncoder(out, null);
          writer.write(datum, encoder);
          encoder.flush();
          out.close();
      
          // deserialize
          DatumReader<Pair> reader = new SpecificDatumReader<Pair>(Pair.class);
          Decoder decoder = DecoderFactory.get().binaryDecoder(out.toByteArray(),
          null);
          Pair result = reader.read(null, decoder);
      
          // then
          assertThat(result.getLeft().toString(), is("L"));
          assertThat(result.getRight().toString(), is("R"));
      }
      

      我想知道这个例子有什么问题。感谢您的任何意见。

      仅供参考,我的示例项目回购是https://github.com/philipjkim/avro-examples

1 个答案:

答案 0 :(得分:3)

您的Pair.avsc文件缺少自定义程序包名称的命名空间字段:

...
  "namespace": "org.sooo",
...