如何为复杂的 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 模式?的主要内容,如果未能解决你的问题,请参考以下文章

如何为复杂对象编写自定义 JSON 解码器?

json文档缺少字段的Avro序列化问题

如何为具有 30MB+ 数据的大型平面文件生成单个 .avro 文件

如何为uitableview自定义多选编辑模式

如何为 Apache Beam 中 Avro SpecificRecordBase 的所有子类选择单个编码器?

如何为Piechart元素设置自定义颜色