2012-03-06 13 views
0

Tom Whiteの書籍「Hadoop:The Definitive Guide」によるApache Avroの学習中にエラーが発生しました。SpecificDatumWriterを作成するときにNullPointerExceptionが発生する<T>

例では、3つのステップがあります

  1. をアブロスキーマファイル(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>を使用して、データをシリアライズ/デシリアライズします。

元の例示的な方法は、https://github.com/tomwhite/hadoop-book/blob/master/avro/src/main/java/AvroTest.javatestPairSpecific()あります。

例コード(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. アブロ-の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です。

答えて

3

あなたPair.avscファイルには、カスタムパッケージ名の名前空間フィールドが欠落しています。

... 
    "namespace": "org.sooo", 
... 
+0

それは完璧に動作します。ありがとう! – philipjkim

関連する問題