在avro模式中的联合中包含枚举类型时出现问题

relj7zay  于 2021-06-07  发布在  Kafka
关注(0)|答案(2)|浏览(373)

我正在与apachekafka合作,向kafka主题发送消息。我尝试在avro模式中使用联合,包括用于消息验证的枚举类型。但是我在union中使用枚举类型时遇到了一个问题。我通过postman工具使用kafkarestapi将记录/消息发布到具有模式验证的主题。下面是请求负载,包括模式和内联记录-

{
    "key_schema": "{\"type\": \"record\", \"name\": \"key\", \"fields\": [{\"name\": \"keyInput\", \"type\": \"string\"}]}",
    "value_schema": "{\"type\": \"record\", \"name\": \"value\", \"fields\": [{\"name\": \"valueInput1\", \"type\": \"string\"},{\"name\": \"valueInput2\",\"type\":[{\"type\":\"enum\",\"name\":\"actorobjType\",\"symbols\":[\"Agent\",\"Group\"]},\"null\"],\"default\":null}]}",
    "records": [
        {
            "key": {
                "keyInput": "testUser-key"
            },
            "value": {
                "valueInput1": "testUser-value",
                "valueInput2": "Agent"
            }
        }
    ]
}

当我尝试使用上述请求负载插入记录时,出现以下错误-

{
  "error_code": 42203,
  "message": "Conversion of JSON to Avro failed: Failed to convert JSON to Avro: Expected start-union. Got VALUE_STRING"
}

在搜索了包括stackoverflow在内的不同网站后,我想到了一个建议
在传递记录时要求显式指定类型,如下所示-

{
    "key_schema": "{\"type\": \"record\", \"name\": \"key\", \"fields\": [{\"name\": \"keyInput\", \"type\": \"string\"}]}",
    "value_schema": "{\"type\": \"record\", \"name\": \"value\", \"fields\": [{\"name\": \"valueInput1\", \"type\": \"string\"},{\"name\": \"valueInput2\",\"type\":[{\"type\":\"enum\",\"name\":\"actorobjType\",\"symbols\":[\"Agent\",\"Group\"]},\"null\"],\"default\":null}]}",
    "records": [
        {
            "key": {
                "keyInput": "testUser-key"
            },
            "value": {
                "valueInput1": "testUser-value",
                "valueInput2": {
                    "enum": "Agent"
                }
            }
        }
    ]
}

但我面临以下错误-

{
  "error_code": 42203,
  "message": "Conversion of JSON to Avro failed: Failed to convert JSON to Avro: Unknown union branch enum"
}

同样的建议也适用于其他类型(如string和map)的联合,但对于包含enum的联合,这似乎不起作用。
我还认为可能还有其他类型需要用于enum规范,因此我尝试了下面这样的其他词-

"valueInput2": {
                    "string": "Agent"
                }

"valueInput2": {
                    "enumeration": "Agent"
                }

但似乎都没用。请帮我解决这个问题。

r8xiu3jd

r8xiu3jd1#

由于枚举类型在json格式中不存在,值类型应该更改为正确的类型:namespace+type name在您的示例中,它将是namespace+actorobjtype:“agent”

mbjcgjjk

mbjcgjjk2#

我最终来到了这里,戴维斯·迈克尔的回答给了我一个暗示,帮助我最终找到了答案。
在这个问题的背景下,

"valueInput2": {
    "actorobjType": "Agent"
}

相关问题