如何使用Go创建AVRO文件?

问题描述 投票:0回答:1

我正在尝试使用Go创建一个AVRO文件。到目前为止,我尝试了几个库,并且有一些代码。

问题是我可以使用数据,但是不知道如何序列化存储它。这是我从github.com/hamba/avro获得的代码,进行了一些小的修改。

import (
  "fmt"
  "github.com/hamba/avro"
  "log"
)

type SimpleRecord struct {
        A int64  `avro:"a"`
        B string `avro:"b"`
}

func main() {
    schema, err := avro.Parse(`{
        "type": "record",
        "name": "simple",
        "namespace": "hamba",
        "fields" : [
            {"name": "a", "type": "long"},
            {"name": "b", "type": "string"}
        ]
    }`)
    if err != nil {
        log.Fatal(err)
    }

    in := SimpleRecord{A: 27, B: "foo"}

    data, err := avro.Marshal(schema, in)
    if err != nil {
        log.Fatal(err)
    }

    fmt.Println(data)
}

此代码块打印:

[54 6 102 111 111]

此行对应于数据的avro编码。似乎这就是我需要存储的全部内容,但是我不知道如何创建文件本身。

我尝试过:

mode := int(0644)
    permissions := os.FileMode(mode)
    err = ioutil.WriteFile("file.avro", data, permissions)
    if err != nil {
        log.Fatal(err)
    }

它会生成一个文件。但是,当我尝试使用Python fastavro库将其读取为AVRO文件时,出现错误ValueError: cannot read header - is it an avro file?

但是根据文档(https://godoc.org/github.com/hamba/avro#example-Marshal):“元帅返回v的Avro编码。” Marshal(schema Schema, v interface{}) ([]byte, error),因此data应该是[]byte类型。

go avro
1个回答
0
投票

Avro仅定义数据编码格式,可以将其打包为消息或文件。因此,对于文件存储,应使用Avro OCF-Avro对象容器文件。这是工作中的hamba avro ocf encoder example

在我的代码中,我已编码多行以将其上传到BigQuery(为清楚起见,省略了错误检查,初始化和关闭操作:]

f, err := os.Open("/your/avro/file.avro")
enc, err := ocf.NewEncoder(schema, w, ocf.WithCodec(ocf.Snappy))
for _, item := range items {
    enc.Encode(item)
}
© www.soinside.com 2019 - 2024. All rights reserved.