Pig 脚本中的 SUM 函数
Posted
技术标签:
【中文标题】Pig 脚本中的 SUM 函数【英文标题】:SUM function in Pig script 【发布时间】:2014-03-25 07:03:27 【问题描述】:我是一名学生,正在学习如何使用 hortonworks 沙箱来使用 Pig 脚本。我的问题是我无法正确使用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, '\\d3-(\\d2)-\\d2', 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 的匹配函数推断为多个匹配或都不匹配。请使用显式转换。
【问题讨论】:
【参考方案1】:首先确保您总结的字段是 int 类型
使用 - DESCRIBE A;
检查数据类型
在那之后,我想既然你已经使用了过滤条件,然后在 F1 上使用了 group by -
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】:这是一个幸运的猜测,我也是 Pig 的新手 :)
我不确定 SUM 是否可以转换为 chararray(这可以解释错误),所以请制作 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。
希望我能帮上一点忙!
【讨论】:
【参考方案3】:请尝试以下方法
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, '\\d3-(\\d2)-\\d2', 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;
【讨论】:
以上是关于Pig 脚本中的 SUM 函数的主要内容,如果未能解决你的问题,请参考以下文章