登录
首页 >  Golang >  Go问答

提取 avro 架构

来源:stackoverflow

时间:2024-04-05 13:24:21 429浏览 收藏

欢迎各位小伙伴来到golang学习网,相聚于此都是缘哈哈哈!今天我给大家带来《提取 avro 架构》,这篇文章主要讲到等等知识,如果你对Golang相关的知识非常感兴趣或者正在自学,都可以关注我,我会持续更新相关文章!当然,有什么建议也欢迎在评论留言提出!一起学习!

问题内容

类似这个问题 如何在Python中提取avro文件的模式 有没有办法在事先不知道架构的情况下读取 golang 中的 avro 文件并提取架构?


解决方案


像这样的怎么样(改编自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)
}

好了,本文到此结束,带大家了解了《提取 avro 架构》,希望本文对你有所帮助!关注golang学习网公众号,给大家分享更多Golang知识!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>