代码之家  ›  专栏  ›  技术社区  ›  dmin333

针对嵌套记录AVRO架构的GCP发布/子消息验证失败

  •  0
  • dmin333  · 技术社区  · 2 年前

    我有一个相当复杂的AVRO模式,它通过了验证,但发送给它的消息与我定义的AVRO方案不兼容。

    从那以后,我试图缩小模式范围,以理解为什么会发生这种情况,而且似乎 嵌套记录AVRO架构 在酒吧/酒吧工作不太好。

    例如,考虑以下AVRO模式:

    {
     "type" : "record",
     "name" : "Avro",
     "fields" : [
       {
         "name" : "foo",
         "type" : {
            "name": "foo_1",
            "type": "int"
         }
       }
     ]
    }
    
    

    以及示例消息:

    {
      "foo": {
        "foo_1": 42
      }
    }
    

    上面的示例模式通过了Pub/Sub中的模式验证,但当我测试上面的消息时,它失败了。

    我发现了类似的帖子 here ,但这并没有多大帮助。

    也许Pub/Sub对嵌套记录有问题?

    非常感谢。

    更新

    多亏了Kamal,原来的消息才起作用。我将如何处理UNION[NULL,nestedRecord]的情况?即

    {
        "type": "record",
        "name": "Avro",
        "fields": [
            {
                "name": "foo",
                "type": [
                  "null",
                    {
                      "type": "record",
                      "name": "NestedRecord",
                      "fields": [
                          {
                              "name": "foo_1",
                              "type": "int"
                          }
                      ]
                  }
                ]
            }
        ]
    }
    

    这不是一个有效的架构吗?我的期望是这个模式应该同时处理这两个问题

    {"foo": null}
    

    {
    “foo”:{
    “foo_1”:42
    }
    }
    

    但它只适用于 null 输入,而不是嵌套输入。这似乎是一个非常基本的问题,但这让我非常沮丧,因为Pub/Sub验证错误并没有真正的用处。。

    1 回复  |  直到 2 年前
        1
  •  0
  •   Kamal Aboul-Hosn    2 年前

    您提供的架构没有指定嵌套记录。请注意,您没有其他 "record" 在字段中键入。要与指定的消息匹配的架构是:

    {
        "type": "record",
        "name": "Avro",
        "fields": [
            {
                "name": "foo",
                "type": {
                    "type": "record",
                    "name": "NestedRecord",
                    "fields": [
                        {
                            "name": "foo_1",
                            "type": "int"
                        }
                    ]
                }
            }
        ]
    }
    

    您指定的架构有一个记录,其中只有一个 int 具有名称的字段 foo 。嵌套的 "name" 规范基本上被忽略了。这是一条对您提供的架构有效的消息:

    {
      "foo": 42
    }
    

    对于的情况 union 具有 null ,您需要遵循 JSON encoding rules for a union 。在这种情况下,消息将是:

    {
        "foo": {
            "NestedRecord": {
                "foo_1": 42
            }
        }
    }
    
        2
  •  0
  •   Scott    2 年前

    如果使用Avro JSON格式,对于非null并集,必须在JSON数据中包含类型提示。此处提供更多详细信息: https://avro.apache.org/docs/current/specification/#json-encoding

    这意味着:

    {
      "foo": {
        "foo_1": 42
      }
    }
    

    你可能需要

    {
      "foo": {
        "NestedRecord": {
          "foo_1": 42
        }
      }
    }