阿夫罗架构。如何同时将类型设置为 "record" 和 "null"

Avro Schema. How to set type to "record" and "null" at once

我需要在架构中混合 "record" 类型和空类型。

"name":"specShape",
         "type":{
            "type":"record",
            "name":"noSpecShape",
            "fields":[
               {
                  "name":"bpSsc",
                  "type":"null",
                  "default":null,
                  "doc":"SampleValue: null"
               },...

例如,对于某些数据,specShape 可能为空。

所以如果我将类型设置为

"name":"specShape",
         "type":{
            **"type":["record", "null"],**
            "name":"noSpecShape",
            "fields":[
               {
                  "name":"bpSsc",
                  "type":"null",
                  "default":null,
                  "doc":"SampleValue: null"
               },...

它说

No type: {"type":["record","null"]...

但是如果我将整体类型设置为

"name":"specShape",
         **"type":[{
            "type":"record",
            "name":"noSpecShape",
            "fields":[
               {
                  "name":"bpSsc",
                  "type":"null",
                  "default":null,
                  "doc":"SampleValue: null"
               }, "null"]**,...

它说

Not in union [{"type":"record"

如何联合这两种类型?

您的想法是正确的,您只需要将 "null" 包含在更高级别的 "type" 数组中,而不是包含在 "fields" 数组中(如第三个示例中所示)。这是可空记录的架构:

[
  "null",
  {
    "type": "record",
    "name": "NoSpecShape",
    "fields": [
      {
        "type": "null",
        "name": "bpSsc",
        "default": null
      }
    ]
  }
]

您还可以将其嵌套在需要类型声明的任何位置,例如在另一条记录中:

{
  "type": "record",
  "name": "SpecShape",
  "fields": [
    {
      "type": [
        "null",
        {
          "type": "record",
          "name": "NoSpecShape",
          "fields": [
            {
              "type": "null",
              "name": "bpSsc",
              "default": null
            }
          ]
        }
      ],
      "name": "shape"
    }
  ]
}

JSON-最后一个模式的编码实例如下所示:

  • {"shape": null}
  • {"shape": {"NoSpecShape": {"bpSsc": null}}}