【问题标题】:how to remove duplicate row from output table using Pentaho DI?如何使用 Pentaho DI 从输出表中删除重复行?
【发布时间】:2015-07-09 18:47:35
【问题描述】:

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

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

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

我该如何解决这个问题?

【问题讨论】:

  • 您使用什么步骤将数据存储到表中?是Table Output一步吗?
  • @mzy 是表输出。
  • 是否有标识每一行的键?或者你如何识别重复的行?
  • 该数据中没有键。我们只能比较每一列
  • 这意味着您需要比较表中的所有列才能找出重复的行?好的。我会发布一些解决方案..

标签: pentaho kettle pentaho-design-studio


【解决方案1】:

我想到了两个解决方案:

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

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

    使用以下参数:

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

【讨论】:

  • 对我的数据库表也有影响吗?
  • 你谈谈第二个建议的解决方案吗? - 是的
【解决方案2】:

另一种方法是使用Merge rows (diff) 步骤,然后是Synchronize after merge 步骤。

只要 CSV 中与目标表不同的行数低于总数的 20 - 25%,这通常是性能最友好的选项。

Merge rows (diff) 接受两个输入流,这些输入流必须按其关键字段排序(通过兼容的排序规则),并生成两个输入的并集,每行标记为“新”、“已更改”、“已删除”,或“相同”。这意味着如果您不能使用 ORDER BY 子句,您必须将 Sort rows 步骤放在 CSV 输入上,并且可能来自目标表的输入。将 CSV 输入标记为“比较”行源,将目标表标记为“参考”。

Synchronize after merge 步骤然后将行中标记的更改应用到目标表。请注意,Synchronize after merge 是 PDI(我相信)中唯一需要在“高级”选项卡中输入输入的步骤。您可以在此处设置标志字段和标识行操作的值。应用更改后,目标表将包含与输入 CSV 完全相同的数据。

另请注意,您可以根据需要使用Switch/CaseFilter Rows 步骤来执行删除删除或更新等操作。我经常把“相同”的行去掉,把剩下的写到一个文本文件中,这样我就可以只检查更改了。

【讨论】:

    【解决方案3】:

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

    案例

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

    解决方案

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-08
      • 1970-01-01
      • 2018-12-26
      • 2022-10-15
      相关资源
      最近更新 更多