Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/81.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
理解WHERE子句中的SQL连接_Sql_Hadoop_Apache Pig - Fatal编程技术网

理解WHERE子句中的SQL连接

理解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 (

我有一个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
        (
            (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))。