PIG: сумма и деление, создание объекта

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

пример: имя TAB год TAB количество TAB...

file = LOAD 'file.csv' USING PigStorage('\t') as (type: chararray, year: chararray,
match_count: float, volume_count: float);

-- Group by type
grouped = GROUP file BY type;

-- Flatten
by_type = FOREACH grouped GENERATE FLATTEN(group) AS (type, year, match_count, volume_count);

group_operat = FOREACH by_type GENERATE  
        SUM(match_count) AS sum_m,
        SUM(volume_count) AS sum_v,
       (float)sum_m/sm_v;

DUMP group_operat;

Проблема заключается в объекте групповых операций, который я пытаюсь создать. Я хочу просуммировать все счетчики совпадений, суммировать все счетчики объемов и разделить счетчики совпадений на объемы.

Что я делаю неправильно в своих арифметических операциях/создании объекта? Я получаю сообщение об ошибке: строка 7, столбец 11> скрипту свиньи не удалось проверить: org.apache.pig.impl.logicalLayer.FrontendException: ОШИБКА 1031: несовместимая схема: слева "тип: NULL, год: NULL, match_count :NULL,volume_count:NULL", справа "group:chararray"

Спасибо.


person user3295674    schedule 18.11.2014    source источник


Ответы (2)


Попробуйте так, это вернет тип и сумму.

ОБНОВЛЕНО рабочий код

входной файл.txt

A       2001     10      2
A       2002     20      3
B       2003     30      4
B       2004     40      1

ПигСкрипт:

file = LOAD 'input.txt' USING PigStorage() AS (type: chararray, year: chararray,
match_count: float, volume_count: float);
grouped = GROUP file BY type;
group_operat = FOREACH grouped {
                                 sum_m = SUM(file.match_count);
                                 sum_v = SUM(file.volume_count);
                                 GENERATE group,(float)(sum_m/sum_v) as sum_mv;
                                }
DUMP group_operat;

Вывод:

(A,6.0)
(B,14.0)
person Sivasakthi Jayaraman    schedule 18.11.2014
comment
это вернуло ОШИБКУ 1000: Ошибка при синтаксическом анализе. Лексическая ошибка в строке 17, столбце 0. Обнаружено: ‹EOF› после : - person user3295674; 18.11.2014
comment
Я также обновил решение с вводом, можете ли вы его проверить - person Sivasakthi Jayaraman; 18.11.2014
comment
вышеуказанное решение работает нормально. Похоже, проблема в 17-й строке вашего кода. можешь вставить 17 строку? - person Sivasakthi Jayaraman; 18.11.2014

попробуй это,

file = LOAD 'file.csv' USING PigStorage('\t') as (type: chararray, year: chararray,
match_count: float, volume_count: float);

grouped = GROUP file BY (type,year);

group_operat = FOREACH grouped GENERATE group,
        SUM(file.match_count) AS sum_m,
        SUM(file.volume_count) AS sum_v,
       (float)(SUM(file.match_count)/SUM(file.volume_count)) as sum_mv;

Вышеприведенный скрипт дает группу результатов по типу и году, если вы хотите только группировать по типу, удалите из сгруппированных

grouped = GROUP file BY type;

group_operat = FOREACH grouped GENERATE group,file.year,
        SUM(file.match_count) AS sum_m,
        SUM(file.volume_count) AS sum_v,
       (float)(SUM(file.match_count)/SUM(file.volume_count)) as sum_mv;
person Kishore    schedule 18.11.2014
comment
Спасибо. Если я хочу просто вернуть тип и сумму в конце, я делаю FOREACH group_operat GENERATE file.ngram, sum_mv; ? - person user3295674; 18.11.2014