我正在尝试使用 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):“Marshal 返回 v 的 Avro 编码。” Marshal(schema Schema, v interface{}) ([]byte, error)
,所以 data
应该是 []byte
类型。
最佳答案
Avro 只定义了可以打包为消息或文件的数据编码格式。因此,对于文件存储,应使用 Avro OCF - Avro Object Container Files。这是一个工作 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)
}
关于go - 如何使用 Go 创建 AVRO 文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58421152/