在PIG的3个桌子上的INNER和OUTER JOIN

时间:2014-01-22 17:03:47

标签: join apache-pig

我正在尝试将以下连接语句转换为PIG。

from EXCH e
JOIN (select a,p, count(buyer) from EXCH group by a, p) sq on e.a = sq.a and e.p = sq.p
left outer join myimplocal i on e.a = i.a and e.p = i.p and e.f = i.f and i.imp > 0 and e.iswin = 1

目前,我有这个:

EXCH2 = FOREACH EXCH GENERATE a, p, buyer; 
EXCH2_groupby = GROUP EXCH2 BY (a, p); 
EXCH_alias_sq = FOREACH EXCH2_groupby GENERATE EXCH2.a, EXCH2.p, COUNT(EXCH2.buyer);
join_EXCH_and_EXCH_alias_sq = JOIN EXCH by (a, p), EXCH_alias_sq by (a, p);
myimplocal_filterby_imp_notZero = FILTER myimplocal BY imp > 0; 

我应该在执行左外连接之前过滤e.iswin=1吗?我应该将过滤器应用于join_EXCH_and_EXCH_alias_sq,然后在myimplocal_filterby_imp_notZero上进行外部联接 和我的过滤器别名?

非常感谢任何帮助。

1 个答案:

答案 0 :(得分:0)

在我的问题中 - 因为e.iswin是在内连接表的结果的外连接期间执行的,所以我不得不使用Union来给我正确的结果。 这就是我做的: 数据集1: 1)内连接EXCH_and_EXCH_alias_sq 2)用e.iswin = 1过滤结果, 3)左外连接步骤2中的结果与myimplocal

数据集2: 1)内连接EXCH_and_EXCH_alias_sq(与上面的(1)相同) 2)用e.iswin = 0过滤结果

UNION ONSCHEMA(数据集1中步骤3的别名)(数据集2中步骤2的别名)

这给了我正确的结果。