2014-02-05 55 views
1

在使用Pig的Hadoop中,我有幾個獨立的源代碼中有大量的字段,我加載,過濾,項目,組,運行幾個Java UDF,加入,項目和存儲。 (這是Hadoop中的日常生活)。原始數據加載中的一些字段不被UDF使用,直到最終存儲時才需要。攜帶字段,或存儲和加入?

什麼時候通過UDF傳遞未使用的字段比稍後存儲和加入它們更好?

甲瑣碎玩具實例是具有name,weight,height列數據源和我最終想存儲name,weight,heightSquared。我的UDF將爲我打高。哪個更好:

inputdata = LOAD 'data' AS name,weight,height; 
outputdata = FOREACH inputdata 
       GENERATE myudf.squareHeight(name,weight,height) 
       AS (name,weight,heightSquared); 
STORE outputdata INTO 'output'; 

inputdata = LOAD 'data' AS name,weight,height; 
name_weight = FOREACH inputdata 
       GENERATE name,weight; 
intdata1 = FOREACH inputdata 
       GENERATE myudf.squareHeight(name,height) 
       AS (iname,heightSquared); 
intdata2 = JOIN intdata1 BY iname, name_weight BY name; 
outputdata = FOREACH intdata2 
       GENERATE name,weight,heightSquared; 
STORE outputdata INTO 'output'; 

在這種情況下,它看起來很明顯:第一種情況比較好。但是UDF必須讀取並存儲並輸出weight字段。當你有15個領域的時候,UDF不關心它,它有一個是第一種情況,還是更好?

回答

1

如果您有15個字段,UDF不關心,那麼不要將它們發送到UDF。在你的例子中,如果只打算使用第三個字段,那麼沒有必要編寫UDF來創建三個字段。您的示例中的最佳腳本將

inputdata = LOAD 'data' AS name,weight,height; 
outputdata = 
    FOREACH inputdata 
    GENERATE 
     name, 
     weight, 
     myudf.squareHeight(height) AS heightSquared; 
STORE outputdata INTO 'output'; 

這樣解決了UDF情況。如果你有一堆你想要存儲的字段,但是你不會在接下來的幾個map-reduce週期中使用它們,你可能希望立即存儲它們,然後再加入它們。但是,將是一個經驗測試,針對您的具體情況哪種方法更快的問題。

+0

這是我問的問題的一個很好的答案。 (我不知道如何將它應用到我的*實際*情況中,在這種情況下,我將元組的數據庫傳遞給UDF並獲取元組的數據庫作爲回報,我將以單獨的問題的形式提出這個問題。) –

+0

,你花時間寫了一個很好的答案,但沒有upvote這個問題。是什麼使得它缺乏積極性? –

+0

元組的袋子沒有什麼不同。您可以使用投影操作員將您的行李剪切到有趣的區域。不要發送'person'到UDF的三個字段,只需發送'person.height'。現在UDF正在收到一個袋子,其元組只有一個字段。順便說一下,我不確定將過多數據傳遞給UDF是一個性能問題,與可維護性問題一樣多。如果你有幾個MR週期,性能只會發揮作用,正如我在答案的後半部分提到的那樣。至於贊成票 - 我只是不傾向於在問題上投票,這就是全部。 –