如果有这样的数据:
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;
它将提供正确的交叉连接。
答案 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;
请注意,即使A1
和A2
相同,也不能假设记录的顺序相同。但如果你正在做CROSS
或JOIN
,这可能无关紧要。
答案 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;