Как создать файл AVRO с помощью Go? - PullRequest
0 голосов
/ 16 октября 2019

Я пытаюсь создать файл AVRO, используя Go. Пока я попробовал пару библиотек, и у меня есть код.

Проблема в том, что я могу работать с данными, но не знаю, как их сериализовать для хранения. Вот код, который я получил от 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)
    }

И он генерирует файл. Однако, когда я пытаюсь прочитать его как файл AVRO, используя библиотеку Python fastavro, я получаю ошибку ValueError: cannot read header - is it an avro file?.

Но в соответствии с документами (https://godoc.org/github.com/hamba/avro#example-Marshal):) Маршал возвращает кодировку Avrov. "Marshal(schema Schema, v interface{}) ([]byte, error), поэтому data должно быть типа []byte.

...