2012-09-02 31 views
2

我有一個豬腳本從文件中讀取輸入併發送到我們的自定義UDF,它發回帶有2個鍵/值對的映射。之後,我們必須將每個關鍵值對保存在2個不同的位置。我們正在使用Store進行此操作。我們面臨的問題是我們在豬腳本中使用的每個STORE命令都調用我們的自定義UDF。豬多個存儲命令創建重複的工作

>REGISTER MyUDF.jar; 

>LOADFILE = LOAD '$file' AS record:chararray; 
>MAPREC = FOREACH LOADFILE GENERATE MyUDF(record); 
>ERRLIST = FOREACH MAPREC { 
>GENERATE $0#'errorRecord' AS ErrorRecord; 
>}; 
>ERRLIST = FILTER ERRLIST BY ErrorRecord is not null; 

>MLIST = FOREACH MAPREC { 
>GENERATE $0#'mInfo' AS MRecord; 
>}; 
>MLIST = FILTER MLIST BY MRecord is not null; 

>STORE MLIST INTO 'fileOut'; 
>STORE ERRLIST INTO 'errorDir'; 

是否有豬腳本的方式通過UDF將只被調用一次,即使我們有多個商店....

回答

0

我認爲這有什麼幕後發生的事情是MAPREC ISN」由其賦值語句填充。豬正在等待,直到使用MAPREC(這是兩次)來找出它包含的內容。我建議通過使用FOREACH來遍歷MAPREC來創建一箇中間結構。這將強制調用MyUDF一次,然後在以下FOREACH語句中使用該中間結果兩次代替MAPREC。希望這是有道理的。

+0

謝謝克里斯的輸入。我們會嘗試。但是,當我們使用Pig'Explain'時,它顯示了兩個Map Reduce計劃,每個計劃用於2個STORE命令,就像豬腳本一樣....這使我認爲我們如何提取/使用豬關係可能是錯誤的......任何輸入在這 – Sarath

+0

沒錯。我期望看到兩個商店的mapreduce步驟,因爲STORE UDF與OutputFormat類進行交互,每個Reducer通常有一個OutputFormat。 –

+0

Pig不會逐行執行逐行執行的腳本。相反,它會逐步爲賦值語句中的每個「變量」建立公式(缺少更好的單詞)。我不知道Pig如何決定何時開始mapreduce步驟,但在你的情況下,它等待太久。我提出的建議有望在處理的早期觸發另一個mapreduce步驟。 –