我正在创建一个从 CSV 文件获取输入并输出到表的转换。那运行正确,但问题是我是否多次运行该转换。然后输出表一次又一次地包含重复的行。
现在我想从输出表中删除所有重复的行。
如果我反复运行转换,它不应该影响输出表,直到它没有新行。
我该如何解决这个问题?
我正在创建一个从 CSV 文件获取输入并输出到表的转换。那运行正确,但问题是我是否多次运行该转换。然后输出表一次又一次地包含重复的行。
现在我想从输出表中删除所有重复的行。
如果我反复运行转换,它不应该影响输出表,直到它没有新行。
我该如何解决这个问题?
我想到了两个解决方案:
使用Insert / Update
step 而不是Table input
step 将数据存储到输出表中。它将尝试根据您定义的关键字段(在您的情况下为所有字段/列)搜索与传入记录流行匹配的输出表中的行。它是这样工作的:
使用以下参数:
tableField1 = streamField1; tableField2 = streamField2; tableField3 = streamField3;
等等..tableField1, streamField1, N; tableField2, streamField2, N; tableField3, streamField3, N;
等等..将重复值存储到输出表后,您可以使用以下概念删除重复值:
Execute SQL step
您定义删除重复条目并仅保留唯一行的 SQL 的位置。您可以在此处启发创建这样的 SQL:如何删除重复的行?另一种方法是使用Merge rows (diff)
步骤,然后是Synchronize after merge
步骤。
只要 CSV 中与目标表不同的行数低于总数的 20 - 25%,这通常是对性能最友好的选项。
Merge rows (diff)
接受两个必须按其关键字段排序的输入流(通过兼容的排序规则),并生成两个输入的并集,每行标记为“新”、“已更改”、“已删除”或“相同”。Sort rows
这意味着如果您不能使用 ORDER BY 子句,您将不得不对CSV 输入以及可能来自目标表的输入添加步骤。将 CSV 输入标记为“比较”行源,将目标表标记为“参考”。
然后,该Synchronize after merge
步骤将行中标记的更改应用于目标表。请注意,这Synchronize after merge
是 PDI 中唯一需要在“高级”选项卡中输入输入的步骤(我相信)。在那里您设置标志字段和标识行操作的值。应用更改后,目标表将包含与输入 CSV 完全相同的数据。
另请注意,如果需要,您可以使用Switch/Case
或Filter Rows
步骤来执行删除删除或更新等操作。我经常把“相同”的行去掉,把剩下的写到一个文本文件中,这样我就可以只检查更改了。