Tom Whiteの書籍「Hadoop:The Definitive Guide」によるApache Avroの学習中にエラーが発生しました。SpecificDatumWriterを作成するときにNullPointerExceptionが発生する<T>
例では、3つのステップがあります
をアブロスキーマファイル(
Pair.avsc
)を作成{ "type":"record", "name":"Pair", "doc":"A pair of strings.", "fields":[ { "name":"left", "type":"string" }, { "name":"right", "type":"string" } ] }
は
を使用してJavaクラス(
Pair.java
)を作成するスキーマ・ファイルをコンパイル$ java -jar $AVRO_HOME/avro-tools-1.6.2.jar compile schema src/main/resources/Pair.avsc src/main/java/
SpecificDatumWriter<Pair>
とSpecificDatumReader<Pair>
を使用して、データをシリアライズ/デシリアライズします。
元の例示的な方法は、https://github.com/tomwhite/hadoop-book/blob/master/avro/src/main/java/AvroTest.javaでtestPairSpecific()
あります。
例コード(createPairAndSerializeThenDeserialize()
:https://github.com/philipjkim/avro-examples/blob/master/src/test/java/org/sooo/AvroTest.java)を書き換えましたが、元のコードとほぼ同じです。異物は以下の通りです。
- 私が使用したAvroバージョンは1.6.2、オリジナル1.3.2です。
- アブロ-の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"));
}
この例で何が問題なのかを知りたいと思います。コメントありがとうございます。
FYI、私のサンプルプロジェクトのレポはhttps://github.com/philipjkim/avro-examplesです。
それは完璧に動作します。ありがとう! – philipjkim