在Apache NiFi中跨双库取数并按多字段关联合并的实现问询
Apache NiFi实现双表多字段关联合并入库方案
当然可以实现你的需求,下面提供两种适配不同场景的可行方案:
方案一:流式关联(适合大数据量场景)
LookupRecord完全支持多字段关联,这是处理此类需求的高效方式,无需等待全量数据落地:
提取表1数据
- 用
ExecuteSQL连接表1所在数据库,查询出包含ID、date、client_name、attr_client的结果 - 用
ConvertRecord将查询结果转换为结构化格式(比如Avro),方便后续字段匹配和关联
- 用
配置
LookupRecord实现多字段关联- 记录读取器/写入器:选择和
ConvertRecord输出一致的格式(如AvroReader/AvroWriter) - 查找服务:配置
JDBCLookupService连接到表2所在的数据库 - 关联规则:在
Lookup Keys中添加两组映射:- 表1的
ID→ 表2的ID - 表1的
date→ 表2的date
(确保两个表中这两个字段的数据类型完全一致,否则关联会失效)
- 表1的
- 返回字段:指定只获取表2的
address、city字段,忽略不需要的active
- 记录读取器/写入器:选择和
写入目标数据库
- 关联后的FlowFile会自动合并表1和表2的指定字段
- 用
ConvertRecord转换为JDBC兼容格式,再通过PutSQL或ExecuteSQL将数据写入表3
方案二:全量数据关联(适合小数据量场景)
如果数据量不大,也可以先获取全量数据再做关联:
分别提取两张表的全量数据
- 用两个独立的
ExecuteSQL处理器,分别查询表1和表2的全部目标字段 - 将查询结果通过
PutFile或PutHDFS落地到临时存储
- 用两个独立的
合并关联数据
- 用
FetchFile/FetchHDFS读取两个全量文件,传入JoinRecord处理器 - 配置
JoinRecord:- 设置关联字段为
ID和date - 选择连接类型(如INNER JOIN,根据业务需求调整)
- 指定最终要保留的字段:
ID、date、client_name、attr_client、address、city
- 设置关联字段为
- 用
写入表3
- 将关联后的结果转换为数据库兼容格式,再通过写入处理器完成入库
注意事项
- 字段类型匹配:
ID和date在两个表中的数据类型必须严格一致(比如都是INT类型的ID,DATE类型的date),否则关联会出现不匹配的情况 - 异常处理:
LookupRecord可以配置Unmatched Record Behavior,比如将未匹配到的记录路由到失败队列,方便后续排查处理 - 性能选择:大数据量优先用流式关联(LookupRecord),避免全量数据的存储和处理开销;小数据量用全量关联更简单直观
内容的提问来源于stack exchange,提问作者Mark Avreliy
相关产品推荐
相关产品推荐

