Извлечь авро схему в golang - PullRequest
       8

Извлечь авро схему в golang

0 голосов
/ 03 февраля 2020

Аналогично этому вопросу Как извлечь схему для файла avro в python Есть ли способ прочитать файл avro в golang, не зная заранее схемы, и извлечь схему?

1 Ответ

1 голос
/ 05 февраля 2020

Как насчет этого (адаптированный код из https://github.com/hamba/avro/blob/master/ocf/ocf.go):

package main

import (
    "github.com/hamba/avro"
    "log"
    "os"
)

// HeaderSchema is the Avro schema of a container file header.
var HeaderSchema = avro.MustParse(`{
    "type": "record",
    "name": "org.apache.avro.file.Header",
    "fields": [
        {"name": "magic", "type": {"type": "fixed", "name": "Magic", "size": 4}},
        {"name": "meta", "type": {"type": "map", "values": "bytes"}},
        {"name": "sync", "type": {"type": "fixed", "name": "Sync", "size": 16}}
    ]
}`)

var magicBytes = [4]byte{'O', 'b', 'j', 1}

const (
    schemaKey = "avro.schema"
)

// Header represents an Avro container file header.
type Header struct {
    Magic [4]byte           `avro:"magic"`
    Meta  map[string][]byte `avro:"meta"`
    Sync  [16]byte          `avro:"sync"`
}

func main() {
    r, err := os.Open("path/my.avro")
    if err != nil {
        log.Fatal(err)
    }
    defer r.Close()

    reader := avro.NewReader(r, 1024)

    var h Header
    reader.ReadVal(HeaderSchema, &h)
    if reader.Error != nil {
        log.Println("decoder: unexpected error: %v", reader.Error)
    }

    if h.Magic != magicBytes {
        log.Println("decoder: invalid avro file")
    }
    schema, err := avro.Parse(string(h.Meta[schemaKey]))
    if err != nil {
        log.Println(err)
    }
    log.Println(schema)
}
...