Postgres插入数据时JOLTTransformJSON后执行PutDatabaseRecord报错如何解决
字段匹配问题影响说明
你提到的「表中部分列无对应JSON字段、JSON中部分字段无对应表列」不会直接触发本次报错:
- PutDatabaseRecord默认会自动忽略JSON中没有对应表列的多余字段
- 表列在JSON中缺失的场景,插入时会自动填充NULL,只要你的表列允许为NULL即可正常执行
报错根因
本次两个NumberFormatException报错均来自NiFi侧的类型转换逻辑异常,和字段名匹配无关:
- 你用ConvertJSONToSQL+PutSQL可以正常执行的原因是,该流程会直接把JSON字段值作为字符串传入SQL参数,由Postgres侧做隐式类型转换存入varchar列,不会在NiFi侧做强制类型转换
- 换成PutDatabaseRecord后,你的RecordReader配置大概率开启了自动Schema推导,或者显式把对应字段设为了DATE/TIMESTAMP/数值类型:
- 第一个报错中的日期字符串
Tue Oct 05 15:58:22 EDT 2021被NiFi识别为日期类型,尝试转换为Unix时间戳数值存入,触发数值转换失败 - 第二个报错中的长字符串
20201705101430被NiFi识别为长整型,该值超出BIGINT的最大可存储范围,触发数值转换失败
- 第一个报错中的日期字符串
解决方案
你完全可以在该场景下使用PutDatabaseRecord,按以下步骤修正配置即可:
- 修正RecordReader(JsonTreeReader/JsonPathReader)配置
- 关闭自动Schema推导,显式自定义Schema,所有字段的类型统一设置为STRING,示例Schema结构如下:
{ "type": "record", "name": "detail_r_record", "fields": [ {"name": "你的表列名1", "type": ["null", "string"], "default": null}, {"name": "你的表列名2", "type": ["null", "string"], "default": null} ] }
- 调整PutDatabaseRecord核心配置
Translate Field Names设为false,避免NiFi自动转换字段名大小写或格式Database Type明确选择PostgreSQL,不要使用默认通用配置Quote Column Identifiers设为true,避免Postgres列名大小写敏感导致的匹配问题
- 可选兜底方案:如果仍有类型转换异常,可在PutDatabaseRecord前添加UpdateRecord处理器,强制将所有字段值转换为字符串类型后再入库。
内容的提问来源于stack exchange,提问作者likeGreen
相关产品推荐
相关产品推荐

