NullPointerException при создании SpecificDatumWriter <T> - PullRequest
0 голосов
/ 06 марта 2012

При изучении Apache Avro по книге Тома Уайта «Hadoop: полное руководство» я получил ошибку.

В примере 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> для сериализации / десериализации данных.

Исходный пример метода: testPairSpecific() in https://github.com/tomwhite/hadoop-book/blob/master/avro/src/main/java/AvroTest.java.

Я переписал пример кода (createPairAndSerializeThenDeserialize() в https://github.com/philipjkim/avro-examples/blob/master/src/test/java/org/sooo/AvroTest.java),, который почти аналогичен исходному. Различия:

  1. Avro версия, которую я использовал - 1.6.2, в оригинальной версии 1.3.2.
  2. Содержимое Pair.java, созданное avro-tools.jar, отличается (оригинал: 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"));
}

Я бы хотел знать, что не так с этим примером. Спасибо за любые комментарии.

К вашему сведению, мой репозиторий в качестве примера проекта https://github.com/philipjkim/avro-examples.

1 Ответ

3 голосов
/ 06 марта 2012

В файле Pair.avsc отсутствует поле пространства имен для имени настраиваемого пакета:

...
  "namespace": "org.sooo",
...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...