【问题标题】:Left Outer join drops rows in Pentaho DI左外连接删除 Pentaho DI 中的行
【发布时间】:2017-07-03 00:03:23
【问题描述】:

我有两个数据集(csv 文件),我使用“CSV 文件输入”步骤将它们带入 Pentaho DI 转换。文件 A 有一个列 joincol,其值出现在文件 B 的列 joincol 中。我想在A.joincol = B.joincol条件下将文件A中的数据与文件B中的数据左连接,以从文件B中的wantcol列中获取相应的数据。

很简单的东西。

作为(必要的)初步步骤,我对要连接的列(即A.joincolB.joincol)上的两个数据集进行升序排序。

然后我使用“合并连接”步骤,将文件 A 中的排序数据作为“第一步”,将文件 B 中的排序数据作为“第二步”,并选择“连接类型”为 LEFT OUTER .我在“第一步的密钥”部分下选择“获取关键字段”,并指定 joincol 是唯一要加入的关键字段,然后对“第二步的密钥”执行相同的操作。

所以,连接部分有效,除了:

  • 行被删除,这应该绝对不可能使用左外连接
  • 被删除的行恰好是在升序排序时与joincol的最后一个值对应的行组中的行。

我通过在 Excel 中进行 vlookup 确认文件 A 的 joincol 中的值都出现在文件 B 的 joincol 中。在任何情况下,即使 none 的值出现在文件 B 中,左外连接仍然应该让我至少保留我进入的所有行。

我是 Pentaho 的新手,所以我很难相信我在探索的早期就偶然发现了这样一个疯狂的错误,这意味着我一定错过了一步。但是,我阅读了合并连接的文档,并相信我已经遵循了所有必要的步骤(我在这里列出的那些)。如果我错过了什么,谁能告诉我?也许这是一个常见错误的结果?

非常感谢!

【问题讨论】:

  • 您是否确认这些最后的行存在并由 CSV 文件输入和排序行步骤传递?您可以进行降序排序,然后预览该步骤,您的行应该是第一个。
  • 是的,我没有处理大量数据,我手动检查了每个步骤的输出的每一行。它们在连接的两个输入中都存在。
  • 请阅读minimal reproducible example并采取行动。你的问题很清楚,但需要更多细节。另外,请解释您从哪里获得“步骤”。 (bidimensions.com/category/tutorial/?) PS 如果左边的所有值都出现在右边,那么左连接结果与内连接结果相同。那你为什么要离开呢?

标签: join left-join pentaho pentaho-spoon pentaho-data-integration


【解决方案1】:

联接是典型的 SQL 而不是 PDI。

使用 PDI,有一个主要的数据流,对于每一行,您在另一个流中查找对应关系并返回所需的列。

如果您查找一个值,例如订单的客户,请使用Lookup/Lookup Stream 步骤。当您希望缺少某些值(LEFT JOIN)时,您可以使用默认值。当您只想要具有对应关系的行(INNER JOIN)时,您可以过滤掉您刚刚放置的默认值。

如果您需要返回很多行,例如客户的所有订单,您可以使用Joins/Merge Join。根据经验,反转问题通常更容易。

如果你不能,你是在 FULL OUTER JOIN 的情况下,你必须使用Joins/Join Rows (Cartesian Product),你可以在其中添加一个或多个条件。

【讨论】:

  • 嗨@AlainD,感谢您的回答。我的过程通常是使用左连接,以便在不存在查找值的情况下,我不会丢失数据。对于未找到查找的行,我会将查找列值合并为某个默认值,然后将这些行检查为“踢出”。我相信这是 ETL 开发的标准做法。我只是不清楚为什么左连接不起作用。你有什么见解吗?谢谢!
  • 嗨@Rookatu,没有例子很难说。我的观点是,问题在于传入流中的数据,而不是 PDI 步骤。更有可能是排序顺序,您有很多选项:区分大小写、区域设置、整理器和整体类型。所以检查 CSV 输入是否处于惰性转换模式,以便在进入排序步骤之前将数据从内部二进制字节转换为正确的字符串、数字、日期等。
  • 这是输入数据的问题,或者您认为左侧文件的行数少于右侧文件的行数。
猜你喜欢
  • 2021-03-20
  • 2019-05-30
  • 1970-01-01
  • 2018-03-21
  • 2015-07-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-01
相关资源
最近更新 更多