NiFi向MySQL插入JSON数据时类型转换错误及字段丢失求助
NiFi插入MySQL数组字段问题的解决办法
为啥会出这俩问题
- PutDatabaseRecord报类型转换错:你数据库里
edit_history_tweet_ids的字段类型肯定不对,比如设成了BYTE这种单值类型,但JSON里是字符串数组,强制转类型就炸了。 - ConvertJsontoSql丢字段:这处理器默认不认识JSON数组,直接把数组字段给忽略了,自然插不进去。
方案一:搞定PutDatabaseRecord的类型匹配
- 先改MySQL表结构:把
edit_history_tweet_ids改成MySQL 8.0支持的JSON类型,要是不想用JSON,也可以设成VARCHAR存数组的JSON字符串(但原生JSON更方便查询)。 - 配置PutDatabaseRecord的读/写器:
- 选
JsonReader作为Record Reader,把Schema Access Strategy设成Use Schema Text,然后在Schema Text里手动定义字段类型,明确标注数组:{ "type": "record", "name": "Tweet", "fields": [ {"name": "edit_history_tweet_ids", "type": {"type": "array", "items": "string"}}, {"name": "id", "type": "string"}, {"name": "text", "type": "string"} ] } - 用
MySqlRecordWriter作为Record Writer,确保它能把JSON数组映射到数据库的JSON字段,类型转换就不会出错了。
- 选
- 跑一遍测试,应该就能正常插入了。
方案二:修复ConvertJsontoSql丢字段的问题
- 同样先把数据库的
edit_history_tweet_ids改成JSON类型。 - 加个
JoltTransformJSON处理器在ConvertJsontoSql前面,把数组转成JSON字符串格式,用下面的Jolt规则:
这样数组会变成{ "operation": "modify-overwrite-beta", "spec": { "edit_history_tweet_ids": "=toString" } }["1607615574473080832"]这种字符串,ConvertJsontoSql就能识别了。 - 配置ConvertJsontoSql:在
Column Names里明确写上edit_history_tweet_ids,然后在SQL Type Mapping里把它映射成JSON或者VARCHAR类型。 - 最后用PutSql执行生成的SQL,字段就不会丢了,还能正确插入到数据库里。
额外提俩注意点
- 要是不想改数据库类型,也可以把数组拼成逗号分隔的字符串(用Jolt或者ExecuteScript处理)存到VARCHAR字段,但后续查询得自己拆分,不如原生JSON省心。
- 排查问题时可以先用
ConvertRecord把JSON转成Avro或CSV,看看字段能不能正常解析,再对接数据库处理器,更容易定位问题。
内容的提问来源于stack exchange,提问作者hyoeun
相关产品推荐
相关产品推荐

