2015-06-08 4 views
0

У меня есть файл CSV с тремя столбцами: tweetid, tweet и Userid. Однако в столбце tweet имеются значения, разделенные запятой.Ошибка REGEX_EXTRACT в PIG

т.е. 1 строки данных:

`396124437168537600`,"I really wish I didn't give up everything I did for you, I'm so mad at my self for even letting it get as far as it did.",savava143 

Я хочу, чтобы извлечь все 3 поля индивидуально, но REGEX_EXTRACT дает мне ошибку с этим кодом:

a = LOAD tweets USING PigStorage(',') AS (f1,f2,f3); 

b = FILTER a BY REGEX_EXTRACT(f1,'(.*)\\"(.*)',1); 

Ошибка:

error: Filter's condition must evaluate to boolean. 

ответ

2

В общем случае использование данных PigStrorage (',') приведет к отсутствует savava143 (последнее значение поля)

A = LOAD '/Users/muralirao/learning/pig/a.csv' USING PigStorage(',') AS (f1,f2,f3); 
DUMP A; 

Выход: A: Заметим, что последнее значение поля отсутствует.

(396124437168537600,"I really wish I didn't give up everything I did for you, I'm so mad at my self for even letting it get as far as it did.") 

Для случая использования совместно, чтобы извлечь все значения из CSV файла со значениями полей, имеющих «» мы можем использовать либо CSVExcelStorage или CSVLoader.

Подход 1: Использование CSVExcelStorage

Ref: http://pig.apache.org/docs/r0.12.0/api/org/apache/pig/piggybank/storage/CSVExcelStorage.html

Вход: a.csv

396124437168537600,"I really wish I didn't give up everything I did for you, I'm so mad at my self for even letting it get as far as it did.",savava143 

Pig Сценарий:

REGISTER piggybank.jar; 
A = LOAD 'a.csv' USING org.apache.pig.piggybank.storage.CSVExcelStorage() AS (f1,f2,f3); 
DUMP A; 

Выходные данные:

(396124437168537600,I really wish I didn't give up everything I did for you, I'm so mad at my self for even letting it get as far as it did.,savava143) 

Подход 2: Использование CSVLoader

Ссылка: http://pig.apache.org/docs/r0.9.1/api/org/apache/pig/piggybank/storage/CSVLoader.html

Ниже скрипт использует CSVLoader(), дамп приведет к тем же выходом видели ранее.

A = LOAD 'a.csv' USING org.apache.pig.piggybank.storage.CSVLoader() AS (f1,f2,f3); 
0

Ошибка в том, что вы не хотите, чтобы FILTER на основе регулярных выражений, но GENERATE новых полей на основе регулярных выражений. Чтобы фильтровать, вам нужно знать, нужно ли фильтровать строку, а значит, и логическое требование.

Таким образом, вы должны использовать:

b = FOREACH a GENERATE REGEX_EXTRACT(FIELD, REGEX, HOW_MANY_GROUPS_TO_RETURN); 

Однако, как @Murali Рао сказал, ваши ценности не только кома разделены, но CSV (подумайте, как вы будете обрабатывать кома в твиттере: это не разделитель полей, только некоторый контент).