了解WHERE子句中的SQL连接

时间:2011-05-10 15:24:04

标签: sql hadoop apache-pig

我在SQL中有一个查询,我正在尝试将其转换为Pig Latin(用于Hadoop集群)。大多数时候我没有问题将查询移到Pig,但我遇到了一些我似乎无法弄清楚的事情。

想象一下像这样的选择语句:

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可能是不可能的。 如果是这种情况,我想知道这个语句如何被分解为计算它所需的JOIN(和过滤器)(因为它可能更容易看到如何构造Pig查询)。

我已经去了Pig邮件列表,但我还没有找到一个好的解决方案,因为Pig并没有真正与JOIN做“OR”。我知道这个问题有多奇怪。

(如果的任何人知道如何在猪身上做到这一点,我不会反对看它......)

编辑:有没有人知道这在Hive中是否会更容易,也许?

2 个答案:

答案 0 :(得分:1)

UNION是拼写OR的另一种方式......等等。

也许:

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

答案 1 :(得分:0)

我不喜欢猪,但在SQL中,你的陈述相当于你所写的:

select ...
from a
join b on [your enormous condition]
group by ...

它也会很慢,因为如果没有优化器(例如Postgres)来分解OR子句并使用适当的索引尝试每个子句,那么最终会完全交叉连接这两个表。

如果Pig对后者更有意义,你可以将语句重写为select from (select ... union select ...) group by ...