我有一個豬計劃,我試圖計算兩個行李之間的最小中心。爲了使它起作用,我發現我需要將袋子集中到一個數據集中。整個操作需要很長時間。我想從硬盤的包裝袋或者打開一個UDF中,或者能夠通過另一個關係到UDF而不需要協同組......如何從Yahoo PigLatin UDF中將文件加載到DataBag中?
代碼:
# **** Load files for iteration ****
register myudfs.jar;
wordcounts = LOAD 'input/wordcounts.txt' USING PigStorage('\t') AS (PatentNumber:chararray, word:chararray, frequency:double);
centerassignments = load 'input/centerassignments/part-*' USING PigStorage('\t') AS (PatentNumber: chararray, oldCenter: chararray, newCenter: chararray);
kcenters = LOAD 'input/kcenters/part-*' USING PigStorage('\t') AS (CenterID:chararray, word:chararray, frequency:double);
kcentersa1 = CROSS centerassignments, kcenters;
kcentersa = FOREACH kcentersa1 GENERATE centerassignments::PatentNumber as PatentNumber, kcenters::CenterID as CenterID, kcenters::word as word, kcenters::frequency as frequency;
#***** Assign to nearest k-mean *******
assignpre1 = COGROUP wordcounts by PatentNumber, kcentersa by PatentNumber;
assignwork2 = FOREACH assignpre1 GENERATE group as PatentNumber, myudfs.kmeans(wordcounts, kcentersa) as CenterID;
基本上我的問題是,我需要通過每個專利的子關係(wordcounts,kcenters)。爲了做到這一點,我通過PatentNumber進行了交叉,然後是COGROUP,以便獲得專利號{,{字符數}},{字符數}。如果我能想出一種方式來傳遞關係或者在UDF中打開這些中心,那麼我可以通過PatentNumber對wordcount進行分組,然後運行myudfs.kmeans(wordcount),如果沒有CROSS/COGROUP,希望這會更快。
這是一個昂貴的操作。目前這需要大約20分鐘,似乎是釘住CPU/RAM。我認爲沒有CROSS可能會更有效率。我不確定它會更快,所以我想嘗試一下。
無論如何,它看起來像從內部調用加載函數需要一個PigContext對象,我不從evalfunc得到。而要使用hadoop文件系統,我還需要一些初始對象,我不知道該如何獲取。所以我的問題是如何從PIG UDF內的hadoop文件系統打開一個文件?我也通過main來運行UDF進行調試。所以我需要在調試模式下從正常的文件系統加載。
另一個更好的主意是,如果有一種方法可以將關係傳遞到UDF而不需要CROSS/COGROUP。這將是理想的,特別是如果關係駐留在內存中..即能夠做myudfs.kmeans(wordcounts,kcenters)而不需要CROSS/COGROUP與kcenters ...
但基本的想法是交易IO用於RAM/CPU週期。
無論如何,任何幫助將非常值得讚賞,即使在UDF手冊中,PIG UDF也沒有超出最簡單的文檔記錄。
+1很大的問題!你最近在做什麼?仍在使用nosql? – 2013-06-18 05:41:40