У меня есть программа для свиней, где я пытаюсь вычислить минимальный центр между двумя мешками. Для того, чтобы он работал, я обнаружил, что мне нужно СОГЛАСИТЬ сумки в единый набор данных. Вся операция занимает много времени. Я хочу, чтобы либо открыть один из мешков с диска в формате UDF, или быть в состоянии передать другое соотношение в ОДС без необходимости COGROUP ......Как загрузить файл в DataBag из UDF Yahoo PigLatin?
Код:
# **** 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). Чтобы сделать это, я делаю крест, а затем COGROUP by PatentNumber, чтобы получить набор PatentNumber, {wordcounts}, {kcenters}. Если бы я мог найти способ передать отношение или открыть центры изнутри UDF, тогда я мог бы просто заполнить список слов по PatentNumber и запустить myudfs.kmeans (wordcount), который, надеюсь, будет намного быстрее без CROSS/COGROUP.
Это дорогая операция. В настоящее время это занимает около 20 минут и, похоже, касается процессора/оперативной памяти. Я думал, что это может быть более эффективным без CROSS. Я не уверен, что это будет быстрее, поэтому я бы хотел экспериментировать.
В любом случае, похоже, что вызов функций загрузки изнутри Pig требует объекта PigContext, который я не получаю от evalfunc. И для использования файловой системы hadoop мне нужны и начальные объекты, которые я не вижу, как их получить. Итак, мой вопрос: как я могу открыть файл из файловой системы hadoop из PIG UDF? Я также запускаю UDF через main для отладки. Поэтому мне нужно загрузить из нормальной файловой системы в режиме отладки.
Еще одна лучшая идея была бы, если бы был способ передать отношение в UDF без необходимости использования CROSS/COGROUP. Это было бы идеально, особенно если отношение находится в памяти, то есть возможность делать myudfs.kmeans (wordcounts, kcenters) без необходимости использования CROSS/COGROUP с kcenters ...
Но основная идея заключается в торговле IO для циклов ОЗУ/ЦП.
В любом случае, любая помощь будет высоко оценена, PIG UDF не будут хорошо документированы за пределами самых простых, даже в руководстве UDF.
+1 большой вопрос !! что ты делал все это время? все еще работает над nosql? –