在使用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不關心它,它有一個是第一種情況,還是更好?
這是我問的問題的一個很好的答案。 (我不知道如何將它應用到我的*實際*情況中,在這種情況下,我將元組的數據庫傳遞給UDF並獲取元組的數據庫作爲回報,我將以單獨的問題的形式提出這個問題。) –
,你花時間寫了一個很好的答案,但沒有upvote這個問題。是什麼使得它缺乏積極性? –
元組的袋子沒有什麼不同。您可以使用投影操作員將您的行李剪切到有趣的區域。不要發送'person'到UDF的三個字段,只需發送'person.height'。現在UDF正在收到一個袋子,其元組只有一個字段。順便說一下,我不確定將過多數據傳遞給UDF是一個性能問題,與可維護性問題一樣多。如果你有幾個MR週期,性能只會發揮作用,正如我在答案的後半部分提到的那樣。至於贊成票 - 我只是不傾向於在問題上投票,這就是全部。 –