首页 > 解决方案 > Pentaho 数据集成 Multiway Merge Join

问题描述

我想在 Pentaho 中使用 Multiway Merge Join 步骤?文档严重缺乏,它并没有按照我的直觉认为它会做。

我在 Oracle 中定义了以下表:

JOE1:
A   B   C
1   NY  3
2   NJ  1
3   NJ  3
4   CT  7

JOE2:
B   D
CT  Connecticut
NJ  New Jersey
NY  New York

JOE3:
C   E
1   one
3   three
7   seven

这是我的 .ktr 中的 Multiway Merge Join 步骤中的元数据:

Step name:  Multiway Merge Join

Input Table1:  JOE1    Join Keys: B,C
Input Table2:  JOE2    Join Keys: B
Input Table3:  JOE3    Join Keys: C
Join Type:  INNER

我本来希望我的 .ktr 产生这样的东西:

A   B   C   B_1 D           C_1 E
1   NY  3   NY  New York    3   three
2   NJ  1   NJ  New Jersey  1   one
3   NJ  3   NJ  New Jersey  3   three
4   CT  7   CT  Connecticut 7   seven

但是,相反,我收到以下错误:

**2018/10/12 14:44:25 - Multiway Merge Join.0 - Unexpected conversion error while converting value [B String(2)] to an Integer
2018/10/12 14:44:25 - Multiway Merge Join.0 - 
2018/10/12 14:44:25 - Multiway Merge Join.0 - B String(2) : couldn't convert String to Integer
2018/10/12 14:44:25 - Multiway Merge Join.0 - 
2018/10/12 14:44:25 - Multiway Merge Join.0 - B String(2) : couldn't convert String to number : non-numeric character found at position 1 for value [CT]**

这表明它没有加入我在 .ktr 中定义的加入字段。

不幸的是,我公司的防火墙阻止我发送指向任何文件或图像的链接。如果我做错了什么,或者即使我的行为预期是准确的,我希望我已经提供了足够的信息,以便有人告诉我。

标签: pentahopentaho-data-integration

解决方案


多重合并连接不像 SQL 连接。这是一个合并,看起来像一个 SQL 排序的联合。它采用两个流程(Joe1 和 Joe2),并将记录一个接一个地记录最低记录。特别是流元数据(列名、类型和顺序)必须相同,这是 PDI 应该警告您的(除非您之前按下了不再告诉我按钮)。

您可以使用Join row (cartesian product). 不用担心它不是笛卡尔积,因为您可以指定它JOE1.B = JOE2.B(以及更多)。PDI 会记住您之前对传入流进行排序(除非您之前按下了不再告诉我按钮)。当然,您必须这样做两次:一次将 Joe1 与 Joe2 连接,一次将生成的流连接到 Joe3。

但是,在您的情况下,您不是在joins之后,而是在look up 之后。对于每个Joe1.B,您正在搜索一个Joe2.B,对于每个Joe1.C,您正在寻找一个Joe3.C。就像在附图中一样,第一个查找已打开,因此您可以查看参数。[不要忘记指定返回列的类型!]

请注意,您始终可以将所有这些都放在 SQL:SELECT * FROM joe1 JOIN joe2 ON joe2.B=joe1.B JOIN joe3 ON joe3.C=joe1.C中。但这将更难维护,并且如果查询很复杂(大量的连接和许多跨表关系),它可能会比 PDI 慢。

在此处输入图像描述


推荐阅读