带有 int 的猪拉丁语中的 sum 函数出现错误 1045
Posted
技术标签:
【中文标题】带有 int 的猪拉丁语中的 sum 函数出现错误 1045【英文标题】:Error 1045 on sum function in pig latin with an int 【发布时间】:2013-05-06 18:53:35 【问题描述】:以下猪拉丁文脚本:
data = load 'access_log_Jul95' using PigStorage(' ') as (ip:chararray, dash1:chararray, dash2:chararray, date:chararray, date1:chararray, getRequset:chararray, location:chararray, http:chararray, code:int, size:int);
splitDate = foreach data generate size as size:int , ip as ip, FLATTEN(STRSPLIT(date, ':')) as h;
groupedIp = group splitDate by h.$1;
a = foreach groupedIp
added = foreach splitDate generate SUM(size); --
generate added;
;
describe a;
给我错误:
ERROR 1045:
<file 3.pig, line 10, column 39> Could not infer the matching function for org.apache.pig.builtin.SUM as multiple or none of them fit. Please use an explicit cast.
这个错误让我觉得我需要将 size 转换为 int,但如果我描述我的 groupedIp
字段,我会得到以下架构。
groupedIp: group: bytearray,splitDate: (size: int,ip: chararray,h: bytearray)
表示 size 是一个 int,应该可以被 sum 函数使用。
我是否错误地调用了 sum 函数?如果您想查看其他任何内容,例如输入文件,请告诉我。
【问题讨论】:
【参考方案1】:SUM 在 bag 上作为输入进行操作,但您将字段“size
”传递给它。
尝试消除嵌套的 foreach 并使用:
a = foreach groupedIp generate SUM(splitDate.size);
【讨论】:
太棒了,我认为这行得通。但是,我现在收到此错误:java.lang.Exception: java.lang.ClassCastException: java.lang.String cannot be cast to org.apache.pig.data.Tuple
。我看不到从字符串创建元组的位置,也不明白为什么 pig 不够聪明,无法将字符串放入新元组,而不是强制转换。【参考方案2】:
对您的数据进行一些转储。我敢打赌size
列中的一些东西是非整数的,Pig 会遇到并死掉。您还可以编写自己的 isInteger udf 代码,以便在其余处理之前检查这一点,并丢弃任何非整数。
【讨论】:
一个可靠的想法,但似乎最后一行中的所有列都是整数。虽然有一对是 0,但这真的不重要,除非我弄错了。【参考方案3】:SUM
、AVG
和 COUNT
是始终对包起作用的函数,因此将数据分组,然后与原始集合连接,如下所示:
A = load 'nyse_data.txt' as (exchange:chararray, symbol:chararray,date:chararray, pen:float,high:float, low:float, close:float,volume:int, adj_close:float);
G = group A by symbol;
C = foreach G generate group, SUM(A.open);
【讨论】:
以上是关于带有 int 的猪拉丁语中的 sum 函数出现错误 1045的主要内容,如果未能解决你的问题,请参考以下文章