Hadoop 如何通过(b,a)过滤a(a,b)关系?

Hadoop 如何通过(b,a)过滤a(a,b)关系?,hadoop,apache-pig,Hadoop,Apache Pig,我有一个通用关系a,如下所示: DUMP A; (a, b) (a, c) (a, d) (b, a) (d, a) (d, b) 注意有一对(a,b)和(b,a);但是(d,b)没有一对。 我想过滤掉那些“未配对”的元组 最终结果应该是: DUMP R; (a, b) (a, d) (b, a) (d, a) 我怎么能把这个写在猪身上 我可以用以下代码解决,但是交叉操作太昂贵了: A_cp = FOREACH L GENERATE u1, u2; X = CROSS A, A_cp; F

我有一个通用关系a,如下所示:

DUMP A;
(a, b)
(a, c)
(a, d)
(b, a)
(d, a)
(d, b)
注意有一对(a,b)和(b,a);但是(d,b)没有一对。 我想过滤掉那些“未配对”的元组

最终结果应该是:

DUMP R; 
(a, b)
(a, d)
(b, a)
(d, a)
我怎么能把这个写在猪身上

我可以用以下代码解决,但是交叉操作太昂贵了:

A_cp = FOREACH L GENERATE u1, u2;
X = CROSS A, A_cp;
F = FILTER X BY ($0 == $3 AND $1 == $2);
R = FOREACH F GENERATE $0, $1;

这是我的
描述的输出;倾倒垃圾

A: {first: chararray,second: chararray}
(a,b)
(a,c)
(a,d)
(b,a)
(d,a)
(d,b)
这是解决此问题的一种方法:

A = LOAD 'foo.in' AS (first:chararray, second:chararray) ;
-- Can't do a join on its self, so we have to duplicate A
A2 = FOREACH A GENERATE * ;

-- Join the As so that are in (b,a,a,c) etc. pairs.
B = JOIN A BY second, A2 BY first ; 

-- We only want pairs where the first char is equal to the last char.
C = FOREACH (FILTER B BY A::first == A2::second)
    -- Now we project out just one side of the pair.
    GENERATE A::first AS first, A::second AS second ;
输出:

C: {first: chararray,second: chararray}
(b,a)
(d,a)
(a,b)
(a,d)
更新:正如WinnieNicklaus指出的,这可以缩短为:

B = FOREACH (JOIN A BY (first, second), A2 BY (second, first))
    GENERATE A::first AS first, A::second AS second ;

谢谢,我会试试你的代码。我可以用下面的代码完成这个任务,但是交叉操作太昂贵了:A_cp=FOREACH A GENERATE u1,u2;X=交叉点A,A_cp;F=按($0==$3和$1==$2)过滤X;R=FOREACH F生成$0,$1@user2730009内部连接的成本应该大大降低。为什么只需一个键就可以使用
连接
,然后使用单独的
过滤器
?您只需执行
B=通过(第一,第二)连接A,通过(第二,第一)连接A2@WinnieNicklaus不知道我能做到。。。看来我还有很长的路要走。