如何使用Pentaho DI从输出表中删除重复的行?

问题描述 投票:1回答:2

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

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

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

我怎样才能解决这个问题?

pentaho kettle pentaho-design-studio
2个回答
0
投票

我想到了两个解决方案。

  1. 使用 Insert / Update 代替 Table input 步骤将数据存储到输出表中。它将根据您定义的关键字段(在您的情况下是所有字段列),尝试在输出表中搜索与传入记录流匹配的行。它的工作原理是这样的。

    • 如果找不到该行,它就插入该行。如果能找到,并且要更新的字段相同,则不做任何操作。如果它们不完全相同,则更新表中的行。

    使用以下参数。

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

    • 使用 Execute SQL step 其中你定义的SQL可以删除重复的条目,只保留唯一的行。你可以从这里获得灵感来创建这样一个SQL。如何删除重复的记录?

0
投票

另一种方法是使用 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/CaseFilter Rows 步骤来进行删除或更新等操作。我经常会把 "相同 "的行流掉,然后把剩下的行写到文本文件中,这样我就可以只检查变化。

© www.soinside.com 2019 - 2024. All rights reserved.