2010-04-27 9 views
0

У меня есть программа для свиней, где я пытаюсь вычислить минимальный центр между двумя мешками. Для того, чтобы он работал, я обнаружил, что мне нужно СОГЛАСИТЬ сумки в единый набор данных. Вся операция занимает много времени. Я хочу, чтобы либо открыть один из мешков с диска в формате 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.

+0

+1 большой вопрос !! что ты делал все это время? все еще работает над nosql? –

ответ

1

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

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

+0

Это в основном, как я это сделал ... FileLocalizer.openDFSFile (имя файла, UDFContext.getUDFContext(). GetUDFProperties (myudf.class)) Чтобы проверить существование, я использовал try/catch вокруг него (из-за хаоп-решений часть-0000, .. часть-0009). Мне бы хотелось выяснить, как получить объект DataStorage или PigContext, который работает, поэтому я мог бы использовать fileExists и т. Д., Но не повезло .... – Cervo