【问题标题】:Merging two datasets in Apache Pig在 Apache Pig 中合并两个数据集
【发布时间】:2026-02-14 23:55:01
【问题描述】:

我有两个 hbase 输入别名:

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

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

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

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

我该怎么做?

【问题讨论】:

  • 创建一个通用的连接键,例如使用 REGEX_EXTRACT,然后使用连接操作。

标签: hadoop mapreduce apache-pig cloudera


【解决方案1】:

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

尽管如此,如果您可以保证在加载数据时 Pig 会按照您想要的顺序处理它,则确实存在一种解决方法。使用来自DataFuEnumerate 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;

【讨论】:

    【解决方案2】:

    如果您使用的是 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 之类的操作,则可能会导致不提供唯一序列号。

    【讨论】: