首页 > 解决方案 > 如何为 avro 联合​​类型指定数据而没有歧义?

问题描述

我正在使用 Python 的官方 avro 库,版本 1.8.2 编写一个 Python 程序。

这是一个简单的模式来显示我的问题:

{
  "type": "record",
  "namespace": "com.example",
  "name": "NameUnion",
  "fields": [
    {
      "name": "name",
      "type": [
        {
          "type": "record",
          "namespace": "com.example",
          "name": "FullName",
          "fields": [
            {
              "name": "first",
              "type": "string"
            },
            {
              "name": "last",
              "type": "string"
            }
          ]
        },
        {
          "type": "record",
          "namespace": "com.example",
          "name": "ConcatenatedFullName",
          "fields": [
            {
              "name": "entireName",
              "type": "string"
            }
          ]
        }
      ]
    }
  ]
}

此模式的可能基准是{"name": {"first": "Hakuna", "last": "Matata"}}{"name": {"entireName": "Hakuna Matata"}}

然而,这给歧义留下了余地,因为并非总是 avro 能够检测到联合中指定的正确模式。在这种情况下,任何一个数据都将对应于 1 个且只有 1 个有效模式,但可能存在联合中超过 1 个模式有效的情况。

我想知道是否可以使用类似 的数据{"name": {"FullName": {"first": "Hakuna", "last": "Matata"}}},其中在数据中指定了特定的联合模式名称。

可能吗?怎么做?

标签: pythonavro

解决方案


经过大量研究,我发现包含有关类型信息的表示是Avro JSON encoding standard

不幸的是,在我撰写本文时,官方 python 库和 fastavro 都不支持这一点。


推荐阅读