go - 如何使用 Go 创建 AVRO 文件?

标签 go avro

我正在尝试使用 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/

相关文章:

apache-spark - 读取orc不会触发投影下推和谓词下推

java - 如何将 JSON 消息转换为具有可为空字段的 avro 模式的有效 JSON?

java - 使用架构注册表对 avro 消息进行 Spring 云合约测试

go - 使用 go 测试基于 urfave/cli 的应用程序

Azure SDK for Go - 可以获取 KeyVault 但无法获取 KeyVault.Properties

java - Avro 架构与 Kafka、ClassCastException?

java - Avro 和 Kafka 通过使用 SchemaBuilder

go - 如何等到缓冲 channel (信号量)为空?

go - 如何在golang中解决种族状况?

go - nil不会将数据库记录设置为NULL