我有两个数据集(csv文件),我使用“CSV文件输入”步骤将其带入Pentaho DI转换。文件A有一列joincol
,其值显示在列joincol
的文件B中。我想在条件A.joincol = B.joincol
中将文件A中的数据与文件B中的数据连接起来,以从文件B中的列wantcol
获取相应的数据。
非常简单的东西。
作为(必要的)预备步骤,我对要加入的列(即A.joincol
和B.joincol
)上升的两个数据集进行排序。
然后我使用“合并连接”步骤,将来自文件A的已排序数据作为“第一步”,将来自文件B的已排序数据作为“第二步”,并选择“加入类型”为左外部。我在“第一步的密钥”部分下选择“获取关键字段”,并指定joincol
是唯一要加入的关键字段,然后对“第二步的密钥”执行相同操作。
因此,连接部分工作,除了:
joincol
的最后一个值的行组中的行。通过在Excel中执行vlookup,我确认文件A的joincol
中的值都出现在文件B的joincol
中。在任何情况下,即使文件B中出现 none 值,左外连接仍应至少留下我进入的所有行。
我是Pentaho的新手所以我很难相信我在探索中如此早地偶然发现了这样一个疯狂的错误,这意味着我必须错过一步。但是,我阅读了合并连接的文档,并且相信我已经遵循了所有必要的步骤(我在这里列出的步骤)。如果我错过了什么,谁能让我知道?也许这是常见错误的结果?
非常感谢!
答案 0 :(得分:1)
联接是典型的SQL而不是PDI。
使用PDI,有一个主数据流,对于每一行,您在另一个流中查找对应关系并返回所需的列。
如果您查找一个值,例如订单的客户,请使用Lookup/Lookup Stream
步骤。如果您希望缺少某些值(LEFT JOIN),则可以使用默认值。如果只想要具有对应关系的行(INNER JOIN),则可以过滤掉刚刚放置的默认值。
如果您需要返回多行,例如客户的所有订单,您可以Joins/Merge Join
。根据经验,通常更容易扭转问题。
如果你不能,你就是FULL OUTER JOIN,你必须使用Joins/Join Rows (Cartesian Product)
,你可以在其中添加一个或多个条件。