我正在尝试将下面的join语句转换为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条答案
按热度按时间oogrdqng1#
在我的问题中-由于e.iswin是在对内部联接表的结果执行outerjoin期间执行的,因此我必须使用union来给出正确的结果。这就是我所做的:数据集1:1)内部连接exch\u和别名exch\u sq 2)用e.iswin=1过滤结果,3)用myimplocal左外部连接步骤2中的结果
数据集2:1)inner join exch\u和\u exch\u alias \u sq(与上面的(1)相同)2)用e.iswin=0过滤结果
union onschema(数据集1中步骤3的别名)(数据集2中步骤2的别名)
这给了我正确的结果。