嵌套 Avro 模式

Nesting Avro schemas

根据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 似乎表明架构注册表不能很好地处理架构引用。

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

Can I give the field and schema the same name, address?

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

What if I want to use the AddressUSRecord schema in multiple other schemas, not just person?

您可以使用多种技术来使用多个模式: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"
    }
  ]
}

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

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

[
  {
    "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"
      }
    ]
  }
]

I'd like a solution that works with Confluent Inc.'s Schema Registry.

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