我有两个 hbase 输入别名:
X:
(a1,b2)
(a2,b2)
...
(an,bn)
Y:
(c1)
(c2)
...
(cn)
现在我想“加入”两个别名:X 的第一行和 Y 的第一行。最终结果应该是:
RESULT:
(a1,b1,c1)
(a2,b2,c2)
...
(an,bn,cn)
我怎样才能做到这一点?
我有两个 hbase 输入别名:
X:
(a1,b2)
(a2,b2)
...
(an,bn)
Y:
(c1)
(c2)
...
(cn)
现在我想“加入”两个别名:X 的第一行和 Y 的第一行。最终结果应该是:
RESULT:
(a1,b1,c1)
(a2,b2,c2)
...
(an,bn,cn)
我怎样才能做到这一点?
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;
如果您使用的是 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
,则可能会不提供唯一的序列号。