【问题标题】:NullPointerException when creating SpecificDatumWriter<T>创建 SpecificDatumWriter<T> 时出现 NullPointerException
【发布时间】:2012-03-23 23:53:11
【问题描述】:

在通过 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&lt;Pair&gt;SpecificDatumReader&lt;Pair&gt; 序列化/反序列化数据。

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

我重写了示例代码(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

运行测试后报错:

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"));
}

我想知道这个例子有什么问题。感谢任何 cmets。

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

【问题讨论】:

    标签: java serialization avro


    【解决方案1】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-02-08
      • 2015-03-28
      • 1970-01-01
      • 1970-01-01
      • 2012-08-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多