含短横线的JSON字段生成Avro Schema及服务启用失败求助
这个问题我之前碰到过好几次,核心原因是Avro的字段名要求符合标准标识符规则,短横线(-)属于非法字符——不管是自动推断Schema的处理器还是Avro Schema Registry,都会因为这个字符无法生成合法的Schema或映射代码,反斜杠转义完全没用,因为Avro不支持这种转义方式。
针对你的NiFi 1.4.0版本,给你两个实用的解决方案:
方案一:预处理JSON重命名字段(推荐)
在使用Infer Avro Schema处理器之前,先把带短横线的字段名替换成Avro支持的格式(比如下划线_、驼峰式命名)。推荐用NiFi的JoltTransformJSON处理器,写个简单的转换规则就能搞定:
比如针对你的Last-Name字段,Jolt规范可以这么写:
[ { "operation": "shift", "spec": { "Last-Name": "last_name", // 其他需要转换的字段都按这个格式写 "*": "&" // 保留其他不需要转换的字段 } } ]
处理后的JSON字段名变成last_name,再传入Infer Avro Schema就不会报错了,Schema Registry也能正常编译。
方案二:手动编写Avro Schema并使用别名(兼容原始字段名)
如果下游系统必须保留原始的Last-Name字段名,可以手动编写Avro Schema,通过aliases字段映射原始字段名,绕过自动推断的限制:
示例Schema:
{ "type": "record", "name": "UserRecord", "fields": [ { "name": "last_name", // Avro合法的字段名 "type": "string", "aliases": ["Last-Name"] // 映射原始JSON的字段名 } // 其他字段同理添加 ] }
之后把这个Schema注册到AvroSchemaRegistry,再用ConvertRecord处理器指定这个Schema来处理JSON数据,就能正常解析带短横线的字段,同时Schema Registry也能正常编译启用。
需要注意的是,Infer Avro Schema处理器是自动从JSON推断Schema,没法直接设置别名,所以这种方案需要你手动维护Schema,不能用自动推断。
内容的提问来源于stack exchange,提问作者OpensourceEnthu

