2017-01-02 8 views
0

次のSQLリクエストをPIGスクリプトに変換したいと思います。 私の問題は、私は現在、多くのスクリプトにJOINを使用しており、PIGをゆっくり実行させるようです。簡単なSQLリクエストをApache PIGスクリプトに変換するには?

コードを最適化するにはどうすればよいですか?

SQL要求:

Select distinct 
A.somethingA1, A.somethingA2, A.somethingA3, 
B.somethingB1, B.somethingB2, B.somethingB3, 
C.somethingC1, C.somethingC2, 
D.getFieldX as fieldX, 
F.somethingF1 

From 

TABLE_A A, 
TABLE_B B, 
TABLE_C C, 
TABLE_D D, 
TABLE_E E, 
TABLE_F F 

Where 

A.getField1 = B.getField1 
And A.getField2 = E.getField2 
And A.getField3 = C.getField3 
And A.getField3 = D.getField4 
And A.getField5 = F.getField6 
And F.getField7 = D.getField7 
And D.getFieldX = 'X' 

私はそれが非常に多くのフィールドを持つ巨大な最終的なオブジェクトを作成することができても、一つ一つJOINいくつかを使用する必要がありますか?それとも、単純なFILTERを使うことができますか?

実際には、異なるテーブルのデータにFILTERを使用することはできません。私はできますか?

これまでのところ、私はスクリプト内で少なくとも5 JOINを使用していましたが、それはまったく最適化されていません。 は、ここに私がやったことだ:

A = load 'TABLE_A' using avrostorage(); 
B = load 'TABLE_B' using avrostorage(); 
C = load 'TABLE_C' using avrostorage(); 
D = load 'TABLE_D' using avrostorage(); 
E = load 'TABLE_E' using avrostorage(); 
F = load 'TABLE_F' using avrostorage(); 

data1 = JOIN A by getField1, B by getField1; 
data1 = FOREACH data GENERATE A::somethingA1, A::somethingA2, A::somethingA3, A::getField2, A::getField3, B::somethingB1, B::somethingB2, B::somethingB3; 

data2 = JOIN data1 by getField2, E by getField2; 
data2 = FOREACH data2 GENERATE data1::A::somethingA1, data1::A::somethingA2, data1::A::somethingA3, data1::A::getField2, data1::A::getField3, data1::B::somethingB1, data1::B::somethingB2, data1::B::somethingB3; 

dump data2; 
describe data2; 

などなど...ファイナルテーブルに到達するまで。

ありがとうございます。

+0

MySQLまたはOracleを使用していますか? (含まれていない製品にはタグを付けないでください) – jarlh

+0

今日のヒント:モダンで明示的な 'JOIN'構文に切り替えましょう!書き込みが簡単(エラーなし)、読みやすく保守が容易、必要に応じて外部結合に変換する方が簡単です。 – jarlh

+0

@jarlh申し訳ありませんが、私は質問を取得しない... MySQLまたはOracle?私は実際に両方を使用しています。明確な 'JOIN'はどういう意味ですか?それが私が現在実際に使っている理由です。 – hacks4life

答えて

0

あなたのスクリプトは、複数のMapReduceジョブにジョイン以上の数で翻訳されます。これはHadoopのボトルネックです!

MRのジョブ数を減らすことができます。それはあまりMRの仕事を持っていることが複数の結合を使用して1つのステップでそれを行うようにしてください:

data1 = JOIN A by getField1, B by getField1, C by getField1 -- ...; 
data2 = FOREACH data1 GENERATE A::somethingA1, A::somethingA2, --..; 

そして、あなたは小さな関係を持っている場合、replicatedキーワードを使用することを検討してください。