如何为复杂的 json 文档定义 avro 模式?
Posted
技术标签:
【中文标题】如何为复杂的 json 文档定义 avro 模式?【英文标题】:How to define avro schema for complex json document? 【发布时间】:2015-03-25 15:20:55 【问题描述】:我有一个 JSON 文档,我想将其转换为 Avro,并且需要为此目的指定一个架构。这是我想为其定义 avro 架构的 JSON 文档:
"uid": 29153333,
"somefield": "somevalue",
"options": [
"item1_lvl2": "a",
"item2_lvl2": [
"item1_lvl3": "x1",
"item2_lvl3": "y1"
,
"item1_lvl3": "x2",
"item2_lvl3": "y2"
]
]
我可以为非复杂类型定义架构,但不能为复杂的“选项”字段定义架构:
"namespace" : "my.com.ns",
"type" : "record",
"fields" : [
"name": "uid", "type": "int",
"name": "somefield", "type": "string"
"name": "options", "type": .....
]
感谢您的帮助!
【问题讨论】:
【参考方案1】:这个在线工具(http://avro4s-ui.landoop.com/)非常实用,可以通过给定的有效json生成AVRO架构。
【讨论】:
这太棒了。我有一个相当复杂的 JSON 格式,我需要一个 avro 模式来转换为镶木地板,而这个工具可以解决问题。【参考方案2】:您需要使用 Avro complex types,特别是 arrays 和 records。然后将它们嵌套在一起:
"namespace" : "my.com.ns",
"name": "myrecord",
"type" : "record",
"fields" : [
"name": "uid", "type": "int",
"name": "somefield", "type": "string",
"name": "options", "type":
"type": "array",
"items":
"type": "record",
"name": "lvl2_record",
"fields": [
"name": "item1_lvl2", "type": "string",
"name": "item2_lvl2", "type":
"type": "array",
"items":
"type": "record",
"name": "lvl3_record",
"fields": [
"name": "item1_lvl3", "type": "string",
"name": "item2_lvl3", "type": "string"
]
]
]
另外,为了提高可读性,你可以split the schemainto multiple files。
【讨论】:
> in correct order 在一级嵌套上,Avro 不关心字段顺序。在反序列化过程中,这些字段是根据读者知道的架构按名称访问的。 “以正确的顺序”是指相应的层次顺序。我删除了那个误导性的短语。 记录和枚举名称:请大写驼峰式。以上是关于如何为复杂的 json 文档定义 avro 模式?的主要内容,如果未能解决你的问题,请参考以下文章
如何为具有 30MB+ 数据的大型平面文件生成单个 .avro 文件