嵌套Avro架构

Tia*_*ong 8 schema nested record avro

根据关于嵌套Avro架构的这个问题,嵌套记录模式的正确方法如下:

{
    "name": "person",
    "type": "record",
    "fields": [
        {"name": "firstname", "type": "string"},
        {"name": "lastname", "type": "string"},
        {
            "name": "address",
            "type": {
                        "type" : "record",
                        "name" : "AddressUSRecord",
                        "fields" : [
                            {"name": "streetaddress", "type": "string"},
                            {"name": "city", "type": "string"}
                        ]
                    },
        }
    ]
}
Run Code Online (Sandbox Code Playgroud)

我不喜欢给字段命名,address并且不得不为AddressUSRecord字段的模式提供不同的名称().我可以给字段和模式指定相同的名称address吗?

如果我想AddressUSRecord在多个其他模式中使用模式,而不仅仅是person?如果我想AddressUSRecord在另一个模式中使用,让我们说business,我是否必须将其命名为其他模式?

理想情况下,我想AddressUSRecord在单独的模式中定义,然后让address引用类型AddressUSRecord.但是,目前尚不清楚Avro 1.8.1是否支持这种开箱即用的功能.这篇2014年的文章表明,需要使用自定义代码处理子模式.在Avro 1.8.1中定义可重用模式的最佳方法是什么?

注意:我想要一个与Confluent Inc.的Schema Registry一起使用的解决方案.有一个Google Groups线程似乎表明Schema Registry与模式引用不相称.

小智 15

我可以给字段和模式指定相同的名称,地址吗?

是的,您可以使用与字段名称相同的名称命名记录.

如果我想在多个其他模式中使用AddressUSRecord模式,而不仅仅是人,该怎么办?

您可以使用多种技术使用多个模式:avro模式解析器客户端(JVM和其他)允许您指定多个模式,通常通过names参数(Java Schema$Parser/parse方法允许多个模式String参数).

然后,您可以将依赖模式指定为命名类型:

{
  "type": "record",
  "name": "Address",
  "fields": [
    {
      "name": "streetaddress",
      "type": "string"
    },
    {
      "name": "city",
      "type": "string"
    }
  ]
}
Run Code Online (Sandbox Code Playgroud)

并在父模式之前通过解析器运行:

{
  "name": "person",
  "type": "record",
  "fields": [
    {
      "name": "firstname",
      "type": "string"
    },
    {
      "name": "lastname",
      "type": "string"
    },
    {
      "name": "address",
      "type": "Address"
    }
  ]
}
Run Code Online (Sandbox Code Playgroud)

顺便说一句,这允许您从单独的文件解析.

或者,您也可以以相同的方式解析引用模式的单个Union模式:

[
  {
    "type": "record",
    "name": "Address",
    "fields": [
      {
        "name": "streetaddress",
        "type": "string"
      },
      {
        "name": "city",
        "type": "string"
      }
    ]
  },
  {
    "type": "record",
    "name": "person",
    "fields": [
      {
        "name": "firstname",
        "type": "string"
      },
      {
        "name": "lastname",
        "type": "string"
      },
      {
        "name": "address",
        "type": "Address"
      }
    ]
  }
]
Run Code Online (Sandbox Code Playgroud)

我想要一个与Confluent Inc.的Schema Registry一起使用的解决方案.

模式注册表不支持单独解析模式,但它确实支持解析为union类型的后一个示例.