2017-01-02 65 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工作做在一個步驟:

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

如果你有一個小的關係,考慮使用replicated關鍵字。