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)

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

信息:猪版本 0.11

== 更新 ==

如果我对 A 进行排序:

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

它将给出正确的交叉连接。

4

2 回答 2

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相同,您也不能假设记录的顺序相同。但是,如果您正在执行CROSSor JOIN,这可能无关紧要。

于 2013-03-06T21:49:53.527 回答
10

我认为您必须两次加载数据才能达到您想要的效果。

IE

A1 = LOAD 'data' AS (a1:int,a2:int,a3:int);
A2 = LOAD 'data' AS (a1:int,a2:int,a3:int);
B = CROSS A1, A2;
于 2013-03-06T19:58:16.610 回答