【问题标题】:Convert protobuf to Avro将 protobuf 转换为 Avro
【发布时间】:2015-11-18 09:00:33
【问题描述】:

我正在尝试将 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 前 4 个字节匹配的前 4 个字节。我想看看我是否做错了什么。

感谢您能给我的任何帮助。

【问题讨论】:

    标签: java protocol-buffers avro


    【解决方案1】:

    我知道为什么我的代码不起作用了。我们应该将它包装在 DataFileWriter 中,而不是使用 ProtobufDatumWriter 直接写入文件,它是一个容器。

        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();
    

    【讨论】:

      猜你喜欢
      • 2013-07-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-11-22
      • 2019-12-17
      • 1970-01-01
      • 2014-06-22
      • 2020-07-13
      相关资源
      最近更新 更多