猪的自我交叉加入被忽视

时间:2013-03-06 19:48:08

标签: apache-pig cross-join

如果有这样的数据:

A = LOAD 'data' AS (a1:int,a2:int,a3:int);

DUMP A;
(1,2,3)
(4,2,1)

然后在A,A:

上完成交叉连接
B = CROSS A, A;

DUMP B;
(1,2,3)
(4,2,1)

为什么第二个A从查询中优化出来?

info:pig version 0.11

== UPDATE ==

如果我对A进行排序:

C = ORDER A BY a1;
D = CROSS A, C;

它将提供正确的交叉连接。

2 个答案:

答案 0 :(得分:14)

davek是正确的 - 你不能CROSS(或JOIN)与自己的关系。如果要执行此操作,则必须创建数据副本。在这种情况下,您可以使用另一个LOAD语句。如果您想通过管道下方的关系执行此操作,则需要使用FOREACH复制它。

我经常使用几个宏,默认情况下IMPORT在我的所有Pig脚本中都需要它们。一个用于此目的:

DEFINE DUPLICATE(in) RETURNS out
{
        $out = FOREACH $in GENERATE *;
};

无论您在管道中需要复制,这都适用于您:

A1 = LOAD 'data' AS (a1:int,a2:int,a3:int);
A2 = DUPLICATE(A1);
B = CROSS A1, A2;

请注意,即使A1A2相同,也不能假设记录的顺序相同。但如果你正在做CROSSJOIN,这可能无关紧要。

答案 1 :(得分:10)

我认为你必须加载两次数据以达到你想要的效果。

A1 = LOAD 'data' AS (a1:int,a2:int,a3:int);
A2 = LOAD 'data' AS (a1:int,a2:int,a3:int);
B = CROSS A1, A2;