2010-04-27 34 views
0

我有一個豬計劃,我試圖計算兩個行李之間的最小中心。爲了使它起作用,我發現我需要將袋子集中到一個數據集中。整個操作需要很長時間。我想從硬盤的包裝袋或者打開一個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也沒有超出最簡單的文檔記錄。

+0

+1很大的問題!你最近在做什麼?仍在使用nosql? – 2013-06-18 05:41:40

回答

1

Cervo, 儲錢罐中有一個或多或少的功能叫做LookupInFiles。查看源代碼,轉換爲您的需求應該非常簡單。

http://svn.apache.org/viewvc/hadoop/pig/trunk/contrib/piggybank/java/src/main/java/org/apache/pig/piggybank/evaluation/string/LookupInFiles.java

請發送電子郵件列表,如果您有任何其他問題,文件建議等

+0

這基本上我是如何結束做... FileLocalizer.openDFSFile(文件名,UDFContext.getUDFContext()。getUDFProperties(myudf.class)) 要測試存在,我用的try/catch周圍(因爲Hadoop的製作部分-0000,...部分0009)。我想知道如何獲得DataStorage或PigContext對象,因此我可以使用fileExists等....但沒有運氣...... – Cervo 2010-05-20 03:09:09

相關問題