Как я могу загрузить файл в баз данных из Yahoo Piglatin UDF?

StackOverflow https://stackoverflow.com/questions/2721902

  •  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;

По сути, моя проблема заключается в том, что для каждого патента мне нужно пройти суб-отношения (WordCounts, KCenters). Для этого я делаю крест, а затем Cogroup по патенту, чтобы получить множество патентоморс, {WordCounts}, {kcenters}. Если бы я мог понять способ передать отношения или открыть центры из UDF, то я мог бы просто группировать WordCounts по патенту и запустить myudfs.kmeans (WordCount), который надеюсь, что намного быстрее без креста / Cogroup.

Это дорогая операция. В настоящее время это занимает около 20 минут и, по-видимому, придерживается процессора / оперативной памяти. Я думал, что это может быть более эффективным без креста. Я не уверен, что это будет быстрее, поэтому я хотел бы экспериментировать.

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

Еще одна лучшая идея будет, если бы был способ пройти отношения в UDF, не требуя пересечения / Cogroup. Это было бы идеально, особенно если связь находится в памяти .. то есть возможность сделать myudfs.kmeans (WordCounts, KCenters), не требуя поперечного креста / Cogroup с KCenters ...

Но основная идея состоит в том, чтобы торговать IO для циклов RAM / CPU.

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

Это было полезно?

Решение

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top