理解WHERE子句中的SQL连接
我有一个SQL查询,我正试图将其翻译成Pig拉丁语(用于Hadoop集群)。大多数情况下,我将查询转移到Pig上都没有问题,但我遇到了一些我似乎无法理解的问题 想象一下这样的select语句:理解WHERE子句中的SQL连接,sql,hadoop,apache-pig,Sql,Hadoop,Apache Pig,我有一个SQL查询,我正试图将其翻译成Pig拉丁语(用于Hadoop集群)。大多数情况下,我将查询转移到Pig上都没有问题,但我遇到了一些我似乎无法理解的问题 想象一下这样的select语句: SELECT a.f1, b.f2, b.f3 -- just for example FROM tableA a, tableB b WHERE( ( a.f1 = b.f2 AND ( a.f2 = b.f1 OR (
SELECT a.f1, b.f2, b.f3 -- just for example
FROM tableA a, tableB b
WHERE(
(
a.f1 = b.f2
AND
(
a.f2 = b.f1
OR
(
(a.f2 = 'somestring1' OR a.f2 = 'somestring2')
AND
(b.f1 is null OR b.f1 ='somestring3' OR b.f1 = 'somestring4')
)
)
OR
(
a.f3 = b.f4
AND
(
a.f4 = b.f3
OR
(
(a.f4 = 'somestring5' OR a.f4 = 'somestring6')
AND
(b.f3 is null OR b.f3 ='somestring7' OR b.f3 = 'somestring8')
)
)
)
)
GROUP BY -- some other stuff
现在,我知道直接翻译成Pig是不可能的。
如果是这样的话,我想知道这个语句是如何分解成计算它所需的连接(和过滤器)的(因为更容易看到如何用它构造一个Pig查询)
我已经查看了Pig邮件列表,但我还没有找到一个好的解决方案,因为Pig并没有真正使用“或”连接。我知道这个问题有多奇怪
(如果有人真的知道如何在猪身上做到这一点,我不会反对看它……)
编辑:有人知道这在Hive中是否会更容易吗?联合是另一种拼写或。。。有点 也许:
SELECT a.f1, b.f2, b.f3 -- just for example
FROM tableA a JOIN tableB b
ON a.f1 = b.f2 AND
(a.f2 = b.f1 OR
((a.f2 = 'somestring1' OR a.f2 = 'somestring2') AND
(b.f1 is null OR b.f1 ='somestring3' OR b.f1 = 'somestring4')
)
)
UNION
SELECT a.f1, b.f2, b.f3 -- just for example
FROM tableA a JOIN tableB b
ON a.f3 = b.f4 AND
(a.f4 = b.f3 OR
((a.f4 = 'somestring5' OR a.f4 = 'somestring6') AND
(b.f3 is null OR b.f3 ='somestring7' OR b.f3 = 'somestring8')
)
)
GROUP BY -- some other stuff
关于Pig我不知道,但在SQL中,您的语句相当于您所写的:
select ...
from a
join b on [your enormous condition]
group by ...
这也会很慢,因为如果没有一个优化器(例如Postgres)来分解OR子句并使用适当的索引尝试它们中的每一个,那么最终会将两个表整体交叉连接起来
如果Pig对后者更有意义,您可以将语句重写为
select from(select…union select…)group by…
。问题是我不知道如何处理Pig的“OR”。你可以按字段加入x,按字段加入y,但你不能在其中加入条件,至少就我所知。这能以某种方式用来(逻辑上)去除OR中的语句吗?如果你有耐心的话,你可以将它扩展到16路的联合(我的心算做得不错)。是的。。。我想我可能已经想出了一个方法,只使用连接/fitler和三个联合(以及一个独特的),但我必须摆弄它,看看它是否有效。基于逻辑分布定律(将p/\(q\/r)转换为(p/\q)\/(p/\r))。