将protobuf转换为Avro

5

我正在尝试将一个 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文件已成功创建。如果我使用cat命令查看该文件,可以看到文件中的数据。然而,当我尝试使用avro-tools获取有关已保存的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 的源代码,这个错误意味着前四个字节与“MAGIC”前四个字节不匹配。我正在尝试查看是否有任何错误。
非常感谢您能给予的任何帮助。
1个回答

6

我发现我的代码为什么不起作用了。我们应该把ProtobufDatumWriter写入文件的过程包装在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();

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接