Как я могу загрузить файл в DataBag из UDF Yahoo PigLatin? - PullRequest
0 голосов
/ 27 апреля 2010

У меня есть программа Pig, в которой я пытаюсь вычислить минимальный центр между двумя пакетами. Чтобы это сработало, я обнаружил, что мне нужно собирать пакеты в один набор данных. Вся операция занимает много времени. Я хочу либо открыть одну из сумок с диска в 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;

В основном моя проблема заключается в том, что для каждого патента мне нужно передать подотношения (wordcounts, kcenters). Чтобы сделать это, я делаю кросс, а затем COGROUP по PatentNumber, чтобы получить набор PatentNumber, {wordcounts}, {kcenters}. Если бы я мог найти способ передать отношение или открыть центры из UDF, то я мог бы просто сгруппировать счетчики слов по PatentNumber и запустить myudfs.kmeans (wordcount), который, как мы надеемся, намного быстрее без CROSS / COGROUP.

Это дорогостоящая операция. В настоящее время это занимает около 20 минут и, по-видимому, занимает процессор / ОЗУ. Я думал, что это может быть более эффективным без КРЕСТА. Я не уверен, что это будет быстрее, поэтому я хотел бы поэкспериментировать.

В любом случае, похоже, что для вызова функций загрузки из Pig необходим объект PigContext, который я не получаю от evalfunc. И чтобы использовать файловую систему hadoop, мне также нужны некоторые исходные объекты, которые я не вижу, как получить. Итак, мой вопрос: как я могу открыть файл из файловой системы hadoop из UDF PIG? Я также запускаю UDF через main для отладки. Поэтому мне нужно загрузить из нормальной файловой системы, когда в режиме отладки.

Другая лучшая идея была бы, если бы был способ передать отношение в UDF без необходимости CROSS / COGROUP. Это было бы идеально, особенно если отношение находится в памяти ... то есть возможность выполнять myudfs.kmeans (wordcounts, kcenters) без необходимости CROSS / COGROUP с kcenters ...

Но основная идея заключается в обмене ввода-вывода на циклы оперативной памяти / процессора.

В любом случае любая помощь будет высоко оценена, UDF-функции PIG не очень хорошо документированы, кроме самых простых, даже в руководстве по UDF.

1 Ответ

1 голос
/ 07 мая 2010

Cervo, В копилке есть UDF, который делает более или менее то, что вы хотите, называемый LookupInFiles. Посмотрите исходный код, он должен быть довольно простым для преобразования в ваши потребности.

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

Пожалуйста, напишите список, если у вас есть какие-либо другие вопросы, предложения по документации и т. Д.

...