0

(Hadoopクラスターで使用するために)PigLatinに変換しようとしているSQLのクエリがあります。ほとんどの場合、クエリを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への直接翻訳が不可能かもしれないことを知っています。その場合、このステートメントを計算に必要なJOIN(およびフィルター)にどのように分解するのか疑問に思います(それからPigクエリを作成する方法を確認する方が簡単な場合があります)。

Pigメーリングリストにアクセスしましたが、Pigは実際にはJOINと「OR」を実行しないため、適切な解決策はまだ見つかりません。私はこの質問がいかに奇妙であるかを知っています。

(Pigでこれがどのように行われるかについて誰か知っているなら、私はそれを見ることに反対しません...)

編集:これがHiveでもっと簡単になるかどうか誰かが知っていますか?

4

2 に答える 2

1

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
于 2011-05-10T15:33:09.553 に答える
0

Pigについてはわかりませんが、SQLでは、ステートメントはあなたが書いたものとほぼ同じです。

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

OR句を分解し、それぞれを適切なインデックスで試行するオプティマイザ(Postgresなど)がないため、2つのテーブル全体を相互結合することになります。

select from (select ... union select ...) group by ...Pigが後者をより理解している場合は、代わりにステートメントを書き直すことができます。

于 2011-05-10T15:34:36.393 に答える