我有一个猪计划,我正在尝试计算两个袋子之间的最小中心。为了使其工作,我发现我需要将袋子袋装成一个数据集。整个操作需要很长时间。我想从UDF内的磁盘上打开其中一个袋子,或者能够将另一个关系传递到UDF中而无需进行cogroup ................................

代码:

# **** 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;

基本上我的问题是,对于每项专利,我都需要通过子关系(文字量,kcenters)。为了做到这一点,我进行了一个十字架,然后通过PateNnumber进行cogroup,以获取套装patentnumber,{wordcounts},{kcenters}。如果我能找到一种通过UDF内部的关系或从UDF内部打开中心的方法,那么我只能通过PateNnumber组成WordCounts并运行Myudfs.kmeanss(WordCount),希望没有十字/cogroup的速度会更快。

这是一个昂贵的操作。目前,这大约需要20分钟,并且似乎可以解决CPU/RAM。我认为没有十字架可能会更有效。我不确定它会更快,所以我想尝试一下。

无论如何,看起来像从猪内调用加载函数需要一个我不会从evalfunc获得的对象。要使用Hadoop文件系统,我也需要一些初始对象,我看不到如何获得。因此,我的问题是如何从猪UDF内部从hadoop文件系统打开文件?我还通过Main运行UDF进行调试。因此,在调试模式下,我需要从正常文件系统加载。

另一个更好的想法是,如果有一种方法可以将关系传递到UDF而无需交叉/cogroup。这将是理想的,特别是如果关系驻留在内存中。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。

但是,基本思想是将IO换成RAM/CPU周期。

无论如何,任何帮助都将不胜感激,即使在UDF手册中,猪UDF也没有超出最简单的帮助。

有帮助吗?

解决方案

Cervo,PiggyBank中有一个UDF或多或少地做您想要的,称为Lookupinfiles。查看源代码,转换为您的需求应该非常简单。

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

如果您还有其他问题,文档建议等,请通过电子邮件发送电子邮件。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top