org.apache.avro.AvroTypeException: 未知联合分支 EventId

org.apache.avro.AvroTypeException: Unknown union branch EventId

我正在尝试使用 'kafka-avro-console-producer' 将 json 转换为 avro 并将其发布到 kafka 主题。

我可以做到 json/schema 但对于下面给定的模式和 json 我得到 “org.apache.avro.AvroTypeException:未知联合分支 EventId”错误。

如有任何帮助,我们将不胜感激。

架构:

{
    "type": "record",
    "name": "Envelope",
    "namespace": "CoreOLTPEvents.dbo.Event",
    "fields": [{
        "name": "before",
        "type": ["null", {
            "type": "record",
            "name": "Value",
            "fields": [{
                "name": "EventId",
                "type": "long"
            }, {
                "name": "CameraId",
                "type": ["null", "long"],
                "default": null
            }, {
                "name": "SiteId",
                "type": ["null", "long"],
                "default": null
            }],
            "connect.name": "CoreOLTPEvents.dbo.Event.Value"
        }],
        "default": null
    }, {
        "name": "after",
        "type": ["null", "Value"],
        "default": null
    }, {
        "name": "op",
        "type": "string"
    }, {
        "name": "ts_ms",
        "type": ["null", "long"],
        "default": null
    }],
    "connect.name": "CoreOLTPEvents.dbo.Event.Envelope"
}

而 Json 输入如下:

{
    "before": null,
    "after": {
        "EventId": 12,
        "CameraId": 10,
        "SiteId": 11974
    },
    "op": "C",
    "ts_ms": null
}

在我的例子中,我不能改变模式,我只能改变json这样它可以工作的方式

删除 "connect.name": "CoreOLTPEvents.dbo.Event.Value""connect.name": "CoreOLTPEvents.dbo.Event.Envelope" 作为 The RecordType can only contains {'namespace', 'aliases', 'fields', 'name', 'type', 'doc'} keys。 您能否尝试使用以下架构,看看您是否能够生成消息?

{
  "type": "record",
  "name": "Envelope",
  "namespace": "CoreOLTPEvents.dbo.Event",
  "fields": [
    {
      "name": "before",
      "type": [
        "null",
        {
          "type": "record",
          "name": "Value",
          "fields": [
            {
              "name": "EventId",
              "type": "long"
            },
            {
              "name": "CameraId",
              "type": [
                "null",
                "long"
              ],
              "default": "null"
            },
            {
              "name": "SiteId",
              "type": [
                "null",
                "long"
              ],
              "default": "null"
            }
          ]
        }
      ],
      "default": null
    },
    {
      "name": "after",
      "type": [
        "null",
        "Value"
      ],
      "default": null
    },
    {
      "name": "op",
      "type": "string"
    },
    {
      "name": "ts_ms",
      "type": [
        "null",
        "long"
      ],
      "default": null
    }
  ]
}

如果您使用的是 Avro JSON 格式,则您的输入略有偏差。对于联合,需要指定非空值,以便列出类型信息:https://avro.apache.org/docs/current/spec.html#json_encoding

请参阅下面的示例,我认为应该可行。

{
    "before": null,
    "after": {
        "CoreOLTPEvents.dbo.Event.Value": {
            "EventId": 12,
            "CameraId": {
                "long": 10
            },
            "SiteId": {
                "long": 11974
            }
        }
    },
    "op": "C",
    "ts_ms": null
}