从混合类型JSON生成Kafka写入命令的AVRO Schema遇阻求助
解决方案:处理AVRO Schema中混合类型数组的问题
针对你的Kafka写入命令JSON结构,要解决regs子数组混合字符串与整数类型的问题,有两种可行方案:
方案1:使用联合类型定义数组元素
AVRO支持联合类型(Union),可以指定数组元素为string或int类型的集合。修改后的Schema如下:
{ "namespace": "aa.hivekafka.abc", "type": "record", "name": "d_write_cmd", "fields": [ { "name": "devId", "type": "string" }, { "name": "msgId", "type": "long" }, { "name": "addr", "type": "int" }, { "name": "cmd", "type": "string" }, { "name": "regs", "type": { "type": "array", "items": { "type": "array", "items": ["string", "int"] } } } ] }
- 核心修改:将子数组的
items从单一string改为联合类型["string", "int"],这样AVRO会接受字符串或整数类型的元素。 - 注意:联合类型的顺序不影响匹配,但如果需要指定默认值,默认值的类型必须是联合列表中的第一个类型。
方案2:将子数组改为Record类型(更规范的做法)
观察你的JSON结构,regs的子数组每个元素有固定的业务含义(比如地址字符串、长度整数、类型字符串、计数整数、值整数),用数组存储混合类型并不符合AVRO的设计理念,也不利于后续维护。更规范的方式是将子数组替换为Record类型:
调整后的JSON结构(可选,若业务允许)
{ "devId": "ABCABCABC", "msgId": 207, "addr": 13, "cmd": "write", "regs": [ { "regAddr": "0x00AF", "length": 16, "dataType": "H", "count": 1, "value": 50 } ] }
对应的AVRO Schema
{ "namespace": "aa.hivekafka.abc", "type": "record", "name": "d_write_cmd", "fields": [ { "name": "devId", "type": "string" }, { "name": "msgId", "type": "long" }, { "name": "addr", "type": "int" }, { "name": "cmd", "type": "string" }, { "name": "regs", "type": { "type": "array", "items": { "type": "record", "name": "RegWriteItem", "fields": [ {"name": "regAddr", "type": "string"}, {"name": "length", "type": "int"}, {"name": "dataType", "type": "string"}, {"name": "count", "type": "int"}, {"name": "value", "type": "int"} ] } } } ] }
- 优势:明确每个字段的业务含义,类型约束更清晰,后续扩展或修改字段更方便,也更符合AVRO的结构化设计原则。
内容的提问来源于stack exchange,提问作者Pattatharasu Nataraj
相关产品推荐
相关产品推荐

