2

我有两个 hbase 输入别名:

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

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

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

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

我怎样才能做到这一点?

4

2 回答 2

1

Pig 的一个基本原则是顺序无关紧要。更一般地说,关系是一元组,而不是元组列表。如果顺序对您的数据很重要,那应该反映在数据本身中,而不是恰好存储在其中的方式上。

不过,如果您可以保证在加载数据时 Pig 会按照您想要的顺序处理它,那么确实存在一种解决方法。使用Enumerate来自DataFu的 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;
于 2013-08-12T12:06:36.480 回答
1

如果您使用的是 pig 0.11,那么您可以尝试使用RANK运算符。就像是:

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

如果你只是这样做,RANK X那么它会给每一行一个唯一的序号。如果您执行类似的操作RANK A by $0 DESC,则可能会不提供唯一的序列号。

于 2013-08-12T17:16:01.303 回答