Разделение ввода на подстроки в PIG (Hadoop) - PullRequest
5 голосов
/ 09 сентября 2009

Предположим, у меня есть следующий ввод в Pig:

some

И я хотел бы преобразовать это в:

s
so
som
some

Я (пока) не нашел способа перебрать chararray на латинском свинье. Я нашел функцию TOKENIZE, но она разделяет границы слов. Так может ли «свинья латина» сделать это или для этого требуется класс Java?

Ответы [ 3 ]

6 голосов
/ 13 ноября 2009

Вот как вы можете сделать это с помощью потоковой передачи и Python без написания пользовательских UDF:

Предположим, ваши данные - это всего лишь 1 столбец слов. Сценарий python (назовем его wordSeq.py) для обработки будет:

#!/usr/bin/python
### wordSeq.py ### [don't forget to chmod u+x wordSeq.py !]
import sys
for word in sys.stdin:
  word = word.rstrip()
  sys.stdout.write('\n'.join([word[:i+1] for i in xrange(len(word))]) + '\n')

Затем в своем сценарии pig вы говорите pig, что используете потоковую передачу с указанным выше сценарием и хотите отправить свой сценарий по мере необходимости:

-- wordSplitter.pig ---
DEFINE CMD `wordSeq.py` ship('wordSeq.py');
W0 = LOAD 'words';
W = STREAM W0 THROUGH CMD as (word: chararray);
6 голосов
/ 09 сентября 2009

Niels, TOKENIZE принимает аргумент-разделитель, поэтому вы можете разделить каждую букву; однако я не могу придумать, как заставить его производить перекрывающихся токенов.

Впрочем, написать UDF на Pig довольно просто. Вы просто реализуете простой интерфейс EvalFunc (подробности здесь: http://wiki.apache.org/pig/UDFManual). Свинья была основана на идее пользователей, пишущих свои собственные функции для обработки чего угодно, и поэтому написание собственного UDF является обычной и естественной вещью.

Еще более простым вариантом, хотя и не таким эффективным, является использование потоковой передачи Pig для передачи ваших данных через сценарий (я считаю, что быстрое выполнение сценариев на Perl или Python быстрее, чем реализация классов Java для одноразовых заданий). Вот пример этого: http://www.cloudera.com/blog/2009/06/17/analyzing-apache-logs-with-pig/ - он демонстрирует использование уже существующей библиотеки, сценария Perl, UDF и даже сценария awk на лету.

5 голосов
/ 17 июня 2010

Используйте библиотеку копилки.

http://hadoop.apache.org/pig/docs/r0.7.0/api/org/apache/pig/piggybank/evaluation/string/SUBSTRING.html

Используйте вот так:

REGISTER /path/to/piggybank.jar;
DEFINE SUBSTRING org.apache.pig.piggybank.evaluation.string.SUBSTRING();

OUTPUT = FOREACH INPUT GENERATE SUBSTRING((chararray)$0, 0, 10);
...