我想在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中联接的字段上。
不幸的是,我公司的防火墙阻止了我发送指向任何文件或图像的链接。我希望我能提供足够的信息给别人,以建议我做错了什么,或者即使我的行为期望是正确的。
答案 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可能会变慢。
答案 1 :(得分:0)
对于所有输入流,似乎必须在同一字段上进行连接。它不必具有相同的字段名称,但是从概念上讲,它必须具有相同的数据内容。
感谢AlainD的验证和详细说明!