Функция СУММ в скрипте Pig

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

A = FOREACH logs_base GENERATE device_id,src,src_port,dst,dst_port,tran_ip,tran_port,service,duration,sent,rcvd,sent_pkt,rcvd_pkt,SN,user,group1, REGEX_EXTRACT(date, '\\d{3}-(\\d{2})-\\d{2}', 1) AS(month:chararray);
F1 = FILTER A BY user == 'PR11MS1120' and month == '10';
grpd1 = group F1 by user;
counter = foreach grpd1 {
    sum1 = SUM(A.rcvd);
    sum2 = SUM(A.sent);
    generate sum1, sum2;
};
dump counter;
C = foreach F1 generate rcvd, sent;
dump C;

Когда я сбрасываю только переменную C, я получаю результат, отображающий множество записей, указывающих количество данных, полученных / отправленных для примененного фильтра. например:

(223,123)
(334,444)
(21,12344)
(...,...)

Все, что я действительно хочу сделать, это сложить все эти записи вместе и показать общую сумму полученных и отправленных: (?,?).

Примечание. Я безуспешно пытался изменить тип переменной на int, long и chararray.

Вот некоторые из ошибок, которые я получаю при попытке решить эту проблему:

Не удалось вывести функцию сопоставления для org.apache.pig.builtin.SUM, поскольку несколько или ни один из них не подходят. Пожалуйста, используйте явное приведение.


person user3440462    schedule 25.03.2014    source источник


Ответы (3)


Сначала убедитесь, что суммируемые поля имеют тип int

Используйте - DESCRIBE A; для проверки типа данных. После этого, я думаю, поскольку вы использовали условие фильтра, а затем использовали группу по F1 -

F1 = FILTER A BY user == 'PR11MS1120' and month == '10';
grpd1 = group F1 by user;

Итак, при подведении итогов вы должны использовать F1 вместо A -

counter = foreach grpd1 {
    sum1 = SUM(F1.rcvd);
    sum2 = SUM(F1.sent);
    generate sum1, sum2;
};

Используйте DESCRIBE grpd1;, и вы поймете, что я пытаюсь сказать, буквы «А» не будет. Думаю, это должно решить проблему. Наконец, проверьте логику того, что вы хотите получить в результате, которого я не проверял. Надеюсь это поможет. PS - Я тоже студент и новичок в PIG.

person Parag    schedule 26.03.2014

Удачная догадка, я тоже новичок в Pig :)
Я не уверен, можно ли преобразовать SUM в chararray (это объяснило бы ошибку), поэтому сделайте rcvd и отправьте тип: int, а затем сгенерируйте 2 суммы за мешок грпд1:

 F1 = FILTER A BY user == 'PR11MS1120' and month == '10';
    grpd1 = group F1 by user; 
    C1 = foreach grpd1 generate SUM(F1.rcvd);
    dump C1;
    C2 = foreach grpd1 generate SUM(F1.sent);
    dump C2;

ПРИМЕЧАНИЕ. Дополнительная информация здесь.

Надеюсь, я немного помог!

person dimzak    schedule 26.03.2014

Пожалуйста, попробуйте следующее

A = FOREACH logs_base GENERATE device_id,src,src_port,dst,dst_port,tran_ip,tran_port,service,duration,sent,rcvd,sent_pkt,rcvd_pkt,SN,user,group1, REGEX_EXTRACT(date, '\\d{3}-(\\d{2})-\\d{2}', 1) AS(month:chararray);
F1 = FILTER A BY user == 'PR11MS1120' and month == '10';
grpd1 = group F1 by user;
C = foreach F1 generate group,SUM(F1.rcvd), SUM(F1.sent);
dump C;
person user3558609    schedule 22.04.2014