我正在创建一个转换,从CSV文件中获取输入并输出到一个表格中。这是在正确运行,但问题是如果我运行该转换多次,那么输出表就会一次又一次地包含重复的行。然后,输出的表格包含重复的行一次又一次。
现在我想从输出表中删除所有重复的行。
如果我重复运行该转换,它应该不会影响输出表,直到它没有新的行。
我怎样才能解决这个问题?
我想到了两个解决方案。
使用 Insert / Update
代替 Table input
步骤将数据存储到输出表中。它将根据您定义的关键字段(在您的情况下是所有字段列),尝试在输出表中搜索与传入记录流匹配的行。它的工作原理是这样的。
使用以下参数。
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输入标记为 "比较 "行原点,将目标表标记为 "参考"。
列表中的 Synchronize after merge
步骤,然后将行中标记的更改应用到目标表中。注意 Synchronize after merge
是PDI中唯一需要在高级选项卡中输入的步骤(我相信)。在那里你可以设置标志字段和确定行操作的值。应用这些更改后,目标表将包含与输入的CSV完全相同的数据。
还需要注意的是,你可以使用 Switch/Case
或 Filter Rows
步骤来进行删除或更新等操作。我经常会把 "相同 "的行流掉,然后把剩下的行写到文本文件中,这样我就可以只检查变化。