Я пытаюсь создать файл 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
.