2015-08-24 101 views
0

我正在嘗試將一個protobuf對象轉換爲Avro。我正在使用將protobuf轉換爲Avro

//myProto object is deserialized using google protobuf API 
ProtobufDatumWriter<MyProto> pbWriter = new ProtobufDatumWriter<MyProto>(MyProto.class); 
FileOutputStream fo = new FileOutputStream(args[0]); 
Encoder e = EncoderFactory.get().binaryEncoder(fo, null); 
pbWriter.write(myProto, e); 
fo.flush(); 

avro文件已成功創建。如果我抓住文件,我可以看到文件中的數據。然而,當我試圖用Avro的工具來獲取架構或元信息有關保存的Avro文件,它說

Exception in thread "main" java.io.IOException: Not a data file. 
    at org.apache.avro.file.DataFileStream.initialize(DataFileStream.java:105) 
    at org.apache.avro.file.DataFileReader.<init>(DataFileReader.java:97) 
    at org.apache.avro.tool.DataFileGetSchemaTool.run(DataFileGetSchemaTool.java:47) 

看那架Avro源代碼,錯誤意味着它不具有前4個字節匹配前面的4個字節是MAGIC。我想看看我是否做錯了什麼。

感謝您給我的任何幫助。

回答

0

我弄清楚爲什麼我的代碼無法正常工作。我們不應該使用ProtobufDatumWriter直接寫入文件,而是將其包裝在DataFileWriter中,該DataFileWriter是一個容器。

ProtobufDatumWriter<MyProto> pbWriter = new ProtobufDatumWriter<MyProto>(MyProto.class); 
    DataFileWriter<MyProto> dataFileWriter = new DataFileWriter<MyProto>(pbWriter); 
    Schema schema= ProtobufData.get().getSchema(MyProto.class); 
    dataFileWriter.create(schema, new File("test.avro")); 
    dataFileWriter.append(myProto); 
    dataFileWriter.close(); 
相關問題