合并Apache Pig中的两个数据集

时间:2013-08-12 11:24:38

标签: hadoop mapreduce apache-pig cloudera

我有两个hbase输入别名:

X:
(a1,b2)
(a2,b2)
...
(an,bn)

Y:
(c1)
(c2)
...
(cn)

现在我想“加入”两个别名:X的第一行和Y的第一行。最后的结果应该是:

RESULT:
(a1,b1,c1)
(a2,b2,c2)
...
(an,bn,cn)

我该怎么做?

2 个答案:

答案 0 :(得分:1)

猪的基本原则是秩序无关紧要。更一般地说,关系是元组的,而不是元组的。如果订单对您的数据很重要,那么这应该反映在数据本身中,而不是反映在它存储的方式上。

然而,如果您可以保证在加载数据时Pig会按您想要的顺序处理它,那么确实存在一种解决方法。使用DataFu中的Enumerate UDF:

Xenum = FOREACH (GROUP X ALL) GENERATE FLATTEN(Enumerate(X));
Yenum = FOREACH (GROUP Y ALL) GENERATE FLATTEN(Enumerate(Y));
RESULT = FOREACH (JOIN Xenum BY i, Yenum BY i) GENERATE a, b, c;

答案 1 :(得分:1)

如果您使用的是猪0.11,那么您可以尝试使用RANK运算符。类似的东西:

XR = RANK X ;
YR = RANK Y ;
RESULT = JOIN XR BY $0, YR BY $0 ;

如果您只是RANK X,那么它将为每一行提供唯一的序列号。如果您执行RANK A by $0 DESC之类的操作,则可能无法提供唯一的序列号。