读取数据到 table input pentaho

Reading data to table input pentaho

我有问题。也许有人会帮助我。我有如下转变

在Table_input我从MSSQL数据库读取数据。在 Table_input_2 中,我从 DB2 数据库中读取数据。 在 Merge join 中,我将 ID 与表中的其他属性进行比较。在 Filter rows 中,我找到了相同 ID 不同的记录。现在,我在 xlsx 文件中写下差异。 在Table_input和Table_input2中有很多记录——超过1亿条。差异通常是由 MSSQL 和 DB2 数据库上的查询执行时间造成的。 对于返回的差异,我希望再次执行该过程。我想确定差异是在查询完成时产生的。谁能告诉我怎么做?

根据您的简短描述,您有两个源数据库应该同步,但并非总是如此。您正在使用这个 Pentaho 作业来查找差异,但是当 运行 您发现误报时,由于系统再次赶上,差异会在短时间内消失。

如果您想找到持久的差异,您的选择取决于操作系统的情况。

如果幸运的话,您拥有(或可以获得)来自 MSSQL table 的 rowversion。当行更改时,这些会更新。如果到 DB2 的复制包括这些,您就会确切地知道您是否在比较同一行的版本。

但是,您可能不会在这里询问您是否已经准备好上述内容,所以现在我假设您必须在没有可靠时间戳的情况下凑合使用。此外,可能没有看到很少变化的安静时间。

在您的情况下,我会在转换中一次处理 "small" 个 10k、100k 或 1M 行的行集,并每次使用父作业来增加起始 ID。这减少了查询时间和希望差异。

您可以在我之前的一个回答中看到完整的示例 here。它略有不同,因为那个是针对总记录未知的 offset/limit。

我们的想法是您的转换将参数作为输入,告诉它从哪个 ID 开始以及要获取多少行。然后它处理这些并报告处理的记录数。如果最后一个查询得到接近 0 条记录,你就完成了。由于实时变化,它可能不会完全达到0。

父作业会检查您是否完成,如果没有则更新新的 START_ID 并再次运行转换。

您的 Table 输入对于 DB2 将像这样更改:

SELECT ...
FROM TABLE
WHERE ID >= ${START_ID} 
ORDER BY ID
LIMIT ${BATCH_SIZE}

和MSSQL(时间久了,不一定正确):

SELECT TOP ${BATCH_SIZE} ...
FROM TABLE
WHERE ID >= ${START_ID}
ORDER BY ID

如果 ID 是数字,您可以在转换中删除排序行步骤,从而节省大量时间。如果是字母数字,请保留它们。

Merge(diff) 步骤执行您在 Merge Join 和 Filter 行中执行的操作,但需要相同的字段布局。可能是一个选择。

最后,我会为时间戳添加“获取系统信息”,然后将任何更改的 ID 与您检测到的时间戳一起存储在 table 中。然后仅报告持续时间超过 X minutes/hours/runs.

的差异