Сохраните некоторые поля из PIG в Hbase - PullRequest
1 голос
/ 27 марта 2012

Я пытаюсь извлечь некоторую часть строки и сохранить ее в столбце hbase.

Содержимое файлов:

msgType1   Person xyz has opened Internet:www.google.com from IP:192.123.123.123 for duration 00:15:00

msgType2   Person xyz denied for opening Internet:202.x.x.x from IP:192.123.123.123 reason:unautheticated 

msgType1    Person xyz has opened Internet:202.x.x.x from IP:192.123.123.123 for duration 00:15:00

Исправлен шаблон сообщений, соответствующих msgType.Теперь я пытаюсь сохранить имя человека, место назначения, источник, продолжительность и т. Д. В базе данных.

Я пытаюсь написать скрипт в PIG, чтобы выполнить эту задачу.Но я застрял при извлечении части (извлечение IP-адреса или имени веб-сайта из токена 'Internet: 202.xxx' внутри строки).

Я пробовал регулярное выражение, но оно не работает для меня.Regex всегда выдает эту ошибку:

ERROR 1045: Could not infer the matching function for org.apache.pig.builtin.REGEX_EXTRACT as multiple or none of them fit. Please use an explicit cast.

Есть ли другой способ извлечь это значение и сохранить его в hbase в PIG или в другом месте, кроме PIG?

Ответы [ 2 ]

1 голос
/ 28 марта 2012

Как вы используете функцию REGEX_EXTRACT? Вы видели функцию REGEX_EXTRACT_ALL? Согласно документации (http://pig.apache.org/docs/r0.9.2/func.html#regex-extract-all), должно быть так:

test = LOAD 'test.csv' USING org.apache.pig.builtin.PigStorage(',') AS (key:chararray, value:chararray);
test = FOREACH test GENERATE FLATTEN(REGEX_EXTRACT_ALL (value, '(\\S+):(\\S+)')) as (match1:chararray, match2:chararray);
DUMP test;

Мой файл такой:

1,a:b
2,c:d
3,
1 голос
/ 28 марта 2012

Я знаю, что легко быть ленивым и не делать шаг, но вы действительно должны использовать пользовательскую функцию здесь. Pig хорош в качестве языка потоков данных и не намного больше, поэтому для того, чтобы получить от него всю мощь, вам понадобится использовать множество UDF для прохождения текста и выполнения более сложных операций.

UDF примет одну строку в качестве параметра, а затем вернет кортеж, представляющий (person, destination, source, duration). Чтобы использовать это, вы будете делать:

A = LOAD ...
...
B = FOREACH A GENERATE MyParseUDF(logline);
...
STORE B INTO ...

Вы не упомянули, какой у вас был ключ строки HBase, но перед сохранением убедитесь, что это первый элемент отношения.

...