2013-03-06 206 views
9

如果一个人有这样的数据:自猪交叉联接被忽略

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) 

为什么是第二一个优化从查询中取出?

信息:猪版0.11

== == UPDATE

如果我排序,如:

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

它会给一个正确的交叉联接。

回答

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; 
+0

是因为框架的数据流性质吗? – 2013-03-06 20:00:02

+0

这是因为背景中产生的map-reduce作业的类型:但是您执行连接时,需要两个单独的输入。 – davek 2013-03-06 20:10:07

14

davek是正确的 - 你不能CROSS(或JOIN)与自身的关系。如果你想这样做,你必须创建一个数据的副本。在这种情况下,您可以使用另一个LOAD声明。如果你想通过管道进一步处理关系,你需要使用FOREACH来复制它。

我有几个宏,我经常使用和IMPORT默认情况下在我所有的猪脚本,以防我需要它们。一个用于仅此目的:

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,这可能没有关系。