我正在尝试使用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
。
答案 0 :(得分: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)
}