Pig脚本中的SUM函数

时间:2014-03-25 07:03:27

标签: hadoop apache-pig hortonworks-data-platform

我是一名学生,学习如何使用Hortonworks沙箱使用Pig脚本。我的问题是我无法正确使用SUM功能。我已经成功地分离了防火墙日志的字段,并且我能够执行多个查询并使用count函数...但是在一个案例中我真正需要的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)
(...,...)

我真正想做的就是将所有这些记录一起添加并显示收到和发送的总金额:(?,?)

注意:我尝试将变量类型更改为intlongchararray,但也没有成功。

我在尝试解决此问题时遇到的一些错误是:

  

无法将org.apache.pig.builtin.SUM的匹配函数推断为多个或不适合。请使用明确的演员。

3 个答案:

答案 0 :(得分:1)

这里有一个幸运的猜测,我也是猪的新手:) 我不确定SUM是否可以转换为chararray(这可以解释错误),所以make rcvd和发送类型:int然后生成grpd1包的2个总和:

 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;

注意:更多信息here

希望我帮了一下!

答案 1 :(得分:1)

首先确保您汇总的字段是int

类型

使用 - DESCRIBE A;检查数据类型 在那之后,我想你已经使用了过滤条件,然后在F1上使用了group -

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;,你会理解我想说的,没有'A' 我想这应该可以解决错误。最后,在结果中检查你想要的逻辑我没有检查过。希望这可以帮助。 PS - 我也是PIG的学生和新手。

答案 2 :(得分:0)

请尝试以下

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;