我正在与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"
}
但似乎都没用。请帮我解决这个问题。
2条答案
按热度按时间r8xiu3jd1#
由于枚举类型在json格式中不存在,值类型应该更改为正确的类型:namespace+type name在您的示例中,它将是namespace+actorobjtype:“agent”
mbjcgjjk2#
我最终来到了这里,戴维斯·迈克尔的回答给了我一个暗示,帮助我最终找到了答案。
在这个问题的背景下,