2

我正在创建一个从 CSV 文件获取输入并输出到表的转换。那运行正确,但问题是我是否多次运行该转换。然后输出表一次又一次地包含重复的行。

现在我想从输出表中删除所有重复的行。

如果我反复运行转换,它不应该影响输出表,直到它没有新行。

我该如何解决这个问题?

4

3 回答 3

1

我想到了两个解决方案:

  1. 使用Insert / Updatestep 而不是Table inputstep 将数据存储到输出表中。它将尝试根据您定义的关键字段(在您的情况下为所有字段/列)搜索与传入记录流行匹配的输出表中的行。它是这样工作的:

    • 如果找不到该行,则插入该行。如果可以找到并且要更新的字段相同,则什么也不做。如果它们不完全相同,则更新表中的行。

    使用以下参数:

    • 查找值的键: tableField1 = streamField1; tableField2 = streamField2; tableField3 = streamField3;等等..
    • 更新字段: tableField1, streamField1, N; tableField2, streamField2, N; tableField3, streamField3, N;等等..
  2. 将重复值存储到输出表后,您可以使用以下概念删除重复值:

    • 使用Execute SQL step您定义删除重复条目并仅保留唯一行的 SQL 的位置。您可以在此处启发创建这样的 SQL:如何删除重复的行?
于 2015-04-30T11:23:41.467 回答
0

另一种方法是使用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/CaseFilter Rows步骤来执行删除删除或更新等操作。我经常把“相同”的行去掉,把剩下的写到一个文本文件中,这样我就可以只检查更改了。

于 2015-04-30T17:15:01.400 回答
0

我寻找视觉答案,但答案是文本,所以为像我这样的水壶新手添加这个视觉答案

案子

user-updateslog.csv(具有 dup 值)---> users_table ,仅存储最新的用户详细信息。

解决方案

第 1 步:将 csv 连接到插入/更新,如下面的转换。

在此处输入图像描述

步骤 2:在插入/更新中,添加条件以比较键以查找候选行,然后选择“Y”字段进行更新。

按 Pk 匹配记录,并更新值

于 2021-03-07T21:25:05.910 回答