嵌套Avro架构

时间:2016-11-28 22:19:00

标签: nested schema record avro

根据this question嵌套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"}
                        ]
                    },
        }
    ]
}

我不希望为该字段指定名称address,并且必须为该字段的架构指定一个不同的名称(AddressUSRecord)。我可以为字段和架构指定相同的名称address吗?

如果我想在多个其他模式中使用AddressUSRecord模式,而不仅仅是person,该怎么办?如果我想在其他架构中使用AddressUSRecord,请说business,我是否必须将其命名为其他?

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

注意:我想要一个与Confluent Inc.的架构注册表配合使用的解决方案。有一个Google Groups thread似乎表明Schema Registry与模式引用不相称。

2 个答案:

答案 0 :(得分:11)

  

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

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

  

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

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

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

{
  "type": "record",
  "name": "Address",
  "fields": [
    {
      "name": "streetaddress",
      "type": "string"
    },
    {
      "name": "city",
      "type": "string"
    }
  ]
}

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

{
  "name": "person",
  "type": "record",
  "fields": [
    {
      "name": "firstname",
      "type": "string"
    },
    {
      "name": "lastname",
      "type": "string"
    },
    {
      "name": "address",
      "type": "Address"
    }
  ]
}

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

或者,您也可以以相同的方式解析引用模式的单个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"
      }
    ]
  }
]
  

我想要一个与Confluent公司的架构注册表配合使用的解决方案。

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

答案 1 :(得分:1)

您可以将namespace设置为记录类型,然后在后续字段中使用{namespace}.{name}作为type参数。不幸的是,目前没有可能从其他模式文件中引用类型。