我想使用 Apache Nifi 将数据从 Oracle 数据库 ETL 到 MS SQL Server 数据库。
目标数据库,有 2 个表(有关系)和一个 1-n 基数(n 值很大,比如 20k 之类的),我们将表命名为
Header
和 Detail
。
我在源 (Oracle) 数据库上创建了 2 个视图,一个返回
Header
数据,一个返回 Detail
数据。
因此,我需要从 Oracle 视图中获取所有
Header
,将每条记录插入到 SQL Server 中,然后对于每条记录,从 Oracle 中获取所有 Detail
并将它们插入到 SQL Server 中。
NiFi 中迭代记录的最佳解决方案是什么?
这是应该定期运行的作业。
因此,我开始使用
QueryDatabaseTable
处理器来读取 Header
视图(并且它会增量工作),并使用 PutDatabaseRecord
处理器填充 MS SQL Server 中的 Header
表。效果很好。
现在我想通过
Detail
ExecuteSQL
视图的记录,问题是现在我需要拥有ID
的每个记录的Header
将其传递给ExecuteSQL
的查询,我有写了类似 select * from Detail d where d.header_id = ${ID}
的东西,但失败了,因为 ${id}
是空的。我在将
SplitAvro
插入目标数据库后添加了一个Header
进程,好处是现在我有一堆FlowFiles而不是一个大的(每条记录1个),然后我添加了一个FilterAttribute
进程,所以我可以只拥有 ID
属性。
现在我不知道如何将该属性传递给下一个
ExecuteSQL
进程....
我已经完成了工作,步骤如下: