Понимание объединений SQL в предложении WHERE - PullRequest
0 голосов
/ 10 мая 2011

У меня есть запрос в SQL, который я пытаюсь перевести на Pig Latin (для использования в кластере 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

Теперь я знаю, что прямой перевод на Свинью может быть невозможен.Если это так, мне интересно, как этот оператор разлагается на JOIN (и фильтры), необходимые для его вычисления (так как может быть проще понять, как построить запрос Pig из этого).

Я пошел в список рассылки Pig, но пока не нашел хорошего решения, так как Pig на самом деле не делает «ИЛИ» с JOIN.Я знаю о том, как странно этот вопрос.

(Если кто-нибудь действительно имеет представление о том, как это сделать в Pig, я бы не возражал против того, чтобы смотреть на него ...)

Редактировать: Кто-нибудь знает, может быть, это будет проще в Улей, может быть?

Ответы [ 2 ]

1 голос
/ 10 мая 2011

UNION - это еще один способ написания ИЛИ ... вроде.

Может быть:

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
0 голосов
/ 10 мая 2011

Я не знаю о Pig, но в SQL ваше утверждение эквивалентно тому, что вы написали:

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

Это также будет медленным, потому что, если у вас нет оптимизатора (например, Postgres), который разлагает предложения OR и пробует каждое из них с соответствующим индексом, вы в итоге перекрестно объединяете две таблицы.

Вместо этого вы могли бы переписать утверждение как select from (select ... union select ...) group by ..., если Свинья имеет больше смысла в последнем.

...