NiFi Postgres转Oracle流程:如何将KeyA值复制到KeyB必填列
解决NiFi中给ExecuteSQLRecord输出数据的KeyB列赋值KeyA值的方法
针对你用NiFi从PostgreSQL迁移数据到Oracle时,需要将流程属性KeyA的值赋值给ExecuteSQLRecord生成数据的KeyB列(满足Oracle表KeyB必填的要求),提供以下几种实用方案:
方案1:使用UpdateRecord处理器(推荐,最直观)
在ExecuteSQLRecord和PutDatabaseRecord之间添加UpdateRecord处理器,步骤如下:
- 配置Record Reader:与
ExecuteSQLRecord使用的读取器一致(例如JSONTreeReader,根据你的数据格式选择)。 - 配置Record Writer:与
PutDatabaseRecord兼容的写入器(例如JSONRecordSetWriter)。 - 在Update Strategies中添加规则:
- 目标字段:
KeyB - 更新策略:
Literal Value - 值:
${KeyA}
这样处理器会将每条输出数据的KeyB字段替换为流程中KeyA属性的值。
- 目标字段:
方案2:修改查询SQL直接生成KeyB值
在查询阶段直接将KeyB设为KeyA的值,避免后续转换:
方式A:调整GenerateTableFetch的SQL模板
修改GenerateTableFetch的SQL Query Template,如果原模板是:
SELECT * FROM ${tableName} WHERE ${whereClause}
改为(如果源表无KeyB列,直接新增;如果有KeyB列,替换原有字段):
SELECT col1, col2, '${KeyA}' AS KeyB FROM ${tableName} WHERE ${whereClause}
注:如果表结构不固定,建议不要用
SELECT *,而是明确列出需要的字段,再替换或新增KeyB。
方式B:用ReplaceText修改生成的SQL
如果不想固定模板,在GenerateTableFetch之后、ExecuteSQLRecord之前添加ReplaceText处理器:
- 搜索正则表达式:
SELECT (.*) FROM - 替换为:
SELECT $1, '${KeyA}' AS KeyB FROM - 匹配模式:
Regex Replace
该操作会在查询字段末尾新增KeyB列并赋值为KeyA的值。
方案3:用JoltTransformJSON修改JSON数据
如果ExecuteSQLRecord输出的是JSON格式,可使用JoltTransformJSON处理器修改字段值:
- 配置Jolt Specification为:
{ "operation": "modify-overwrite-beta", "spec": { "KeyB": "${KeyA}" } }
该规则会覆盖每条JSON数据中的KeyB字段值为KeyA属性的值,之后再传给PutDatabaseRecord即可。
内容的提问来源于stack exchange,提问作者Tvitmsvleli
相关产品推荐
相关产品推荐

