如何在 Pig 中进行条件 JOIN?

Posted

技术标签:

【中文标题】如何在 Pig 中进行条件 JOIN?【英文标题】:How to do condition JOIN in Pig? 【发布时间】:2012-06-27 07:08:11 【问题描述】:

我有两个关系 A,B

DESCIBE A
A:ip_num:long,data:int

DESCIBE B
B:ip_start_num:long,ip_end_num:long

我想要产品:

C:group:(ip_start_num:long, ip_end_num:long), B:(ip_num:long, data:int)

where ip_num >ip_start_num && ip_num < ip_end_num

是否有可能与 PigLatin 相关?

【问题讨论】:

【参考方案1】:

但是,您需要在嵌套的 FOREACH 内执行 FILTER 操作;似乎有一个错误,所以这样的句子甚至不会解析。 https://issues.apache.org/jira/browse/PIG-1798。这篇文章也提到了同样的问题。 USING Filter in a Nested FOREACH in PIG

我昨天遇到了同样的问题,有两种解决方案:第一个是编写一个 UDF 来按 ip 范围进行过滤。第二个是找到在两个关系之间进行简单连接的方法,以便您可以拥有另一个关系:

D:ip_num:long,data:int,ip_start_num:long,ip_end_num:long.

您可以在没有嵌套 foreach 的情况下进行过滤。我选择了第二个选择,但这并不总是一种加入方式。

【讨论】:

【参考方案2】:

恐怕在 Pig 中没有 theta-joins。您可以进行交叉连接,然后进行过滤。警惕由此产生的数据爆炸。

【讨论】:

以上是关于如何在 Pig 中进行条件 JOIN?的主要内容,如果未能解决你的问题,请参考以下文章

Pig - 使用位置表示法时如何在 JOIN 后引用 FOREACH 中的列?

Pig Join - 如何连接具有多个字段的两个表,其中键中的一个字段是可选的?

如何在 Pig 中检索前一行的值

如何在 PIG 中进行 DIFF

如何在 Pig Latin 中进行“总结”?

如何在 PIG Script 中实现 IF ELSE 控制逻辑