Pentaho数据集成多路合并联接

时间:2018-10-12 19:44:11

标签: pentaho pentaho-data-integration

我想在Pentaho中使用“多路合并合并”步骤吗?该文档严重缺乏,并且没有按照我的直觉做。

我在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中“多路合并合并”步骤中的元数据:

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中联接的字段上。

不幸的是,我公司的防火墙阻止了我发送指向任何文件或图像的链接。我希望我能提供足够的信息给别人,以建议我做错了什么,或者即使我的行为期望是正确的。

2 个答案:

答案 0 :(得分:0)

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

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

但是,对于您而言,您并不是在加入之后,而是在查找之后。对于每个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可能会变慢。

enter image description here

答案 1 :(得分:0)

对于所有输入流,似乎必须在同一字段上进行连接。它不必具有相同的字段名称,但是从概念上讲,它必须具有相同的数据内容。

感谢AlainD的验证和详细说明!