我在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中是否会更容易,也许?
答案 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 ...
。