将protobuf转换为Avro

时间:2015-08-24 19:59:58

标签: java protocol-buffers avro

我正在尝试将protobuf对象转换为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文件已成功创建。如果我捕获文件,我可以看到文件中的数据。但是,当我尝试使用av​​ro-tools获取有关已保存的avro文件的架构或元信息时,它说

'12' => [
     '+',
     'ATGGTTTTCTTCTCTCCTTCCCTCTCCAGCCTGCTGTATAAGTAA',
     'MGLGLAPSWPSLLTSSYPECVPYLFSHLLPPTTQPYPFSPSLSSLLYK*',
     6125
     ],
'41' => [
     '+',
     'ATGGGAGTTTACTGTGATGACTTGAGGACAGAGGGACTCTAG',
     'MGVYCDDLRTEGL*',
     1686
     ],
'16' => [
     '+',
     'ATGGGAGTTTACTGTGATGACTTGAGGACAGAGGGACTCTAG',
     'MGVYCDDLRTEGL*',
     700
     ]

查看Avro源代码,错误意味着它没有匹配 MAGIC 前4个字节的前4个字节。我想看看我做错了什么。

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

1 个答案:

答案 0 :(得分:3)

我弄清楚为什么我的代码不起作用。我们应该将它包装在DataFileWriter中,而不是使用ProtobufDatumWriter直接写入文件。

class pageGeneration {
    public function __construct($settings, $version, $dbc, $layout, $core, $parser, $admin){
        $this->settings = $settings;
        $this->version = $version;
        $this->dbc = $dbc;
        $this->layout = $layout;
        $this->core = $core;
        $this->parser = $parser;
        $this->admin = $admin;

    }
    public function Generate(){
        print_r($this->settings);  // loop before you leap

        $this->core->GenerationModifiers($this->settings); 

        echo 'settings on return from core method call';
        print_r($this->settings);  // loop after we leapt