如何将文件从Yahoo Piglatin UDF内部加载到数据库中?
-
01-10-2019 - |
题
我有一个猪计划,我正在尝试计算两个袋子之间的最小中心。为了使其工作,我发现我需要将袋子袋装成一个数据集。整个操作需要很长时间。我想从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。查看源代码,转换为您的需求应该非常简单。
如果您还有其他问题,文档建议等,请通过电子邮件发送电子邮件。