如何在 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 中的列?