带有 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】:

SUMAVGCOUNT 是始终对包起作用的函数,因此将数据分组,然后与原始集合连接,如下所示:

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的主要内容,如果未能解决你的问题,请参考以下文章

两个表之间的猪拉丁计数差异

text JavaScript中的猪拉丁语翻译

如何在我的猪脚本中设置多行字符串?

带有非拉丁字符的 Javascript slug 函数

带有空值的猪连接

hortonworks沙箱中的猪错误