Вопрос

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

some

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

s
so
som
some

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

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

Решение

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

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

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

Другие советы

Вот как вы можете сделать это с помощью потоковой передачи pig и 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);

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

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, 10);
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top