Nifi ExecuteSQL报错Unknown SQL type 1111:PostgreSQL转JSON遇问题
这个报错的根源很明确:你的public.users表使用了PostgreSQL专属的hstore扩展类型,而NiFi的ExecuteSQL处理器默认的JDBC类型映射中没有对这种自定义类型(对应的JDBC类型码是1111,也就是OTHER类型)的处理逻辑,导致生成Schema时失败。
下面给你几个可行的解决办法,按推荐程度排序:
方案一:通过SQL查询直接转换hstore为JSON字符串(最简便)
不需要修改NiFi处理器的复杂配置,直接调整ExecuteSQL的查询语句,利用PostgreSQL内置函数把hstore类型转成标准JSON格式的字符串。修改你的SQL查询为:
SELECT id, email, hstore_to_json(settings) AS settings, credited_at FROM public.users;
hstore_to_json函数会把hstore的键值对直接转换成JSON对象,返回的settings字段会被NiFi识别为普通字符串,后续你可以直接用ConvertRecord处理器,搭配JsonRecordSetWriter写入器,把查询结果直接输出为JSON文件。
方案二:配置ExecuteSQL的JDBC类型映射
如果不想修改SQL语句,可以通过扩展ExecuteSQL的类型映射来让它识别hstore类型:
- 打开ExecuteSQL处理器的配置面板,切换到Advanced标签页
- 找到JDBC Type Mapping属性,点击编辑按钮
- 添加一条映射规则:
1111=VARCHAR(这里1111是hstore对应的JDBC类型码,映射到NiFi的VARCHAR类型) - 保存配置后重启处理器
这样ExecuteSQL会把hstore字段当作字符串读取,后续你可以用JoltTransformJSON或者ReplaceText处理器,把hstore的"key"=>"value"格式转换成标准的JSON键值对格式,再生成JSON文件。
方案三:替换为QueryDatabaseTable处理器
如果你的场景适合增量同步或者定期拉取数据,可以考虑用QueryDatabaseTable处理器替代ExecuteSQL:
- 添加
QueryDatabaseTable处理器,配置好PostgreSQL的连接池 - 在Properties标签页的Column Types属性中,添加
settings=VARCHAR,指定该字段的类型为字符串 - 配置好查询的表名和其他参数后运行
这个处理器对PostgreSQL的扩展类型兼容性更好,会自动按你指定的类型转换字段,避免Schema生成错误。
额外提示
如果后续需要把JSON数据写回数据库,记得确保字段类型的一致性;另外,确认你的PostgreSQL JDBC驱动是最新版本,旧版本可能对hstore类型的支持也有问题。
内容的提问来源于stack exchange,提问作者Wilson Ho

