0

以下猪拉丁文脚本:

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.

这个错误让我觉得我需要将大小转换为 int,但如果我描述我的groupedIp领域,我会得到以下架构。

groupedIp: {group: bytearray,splitDate: {(size: int,ip: chararray,h: bytearray)}}这表明 size 是一个 int,并且应该能够被 sum 函数使用。

我是否错误地调用了 sum 函数?让我知道您是否想查看其他内容,例如输入文件。

4

3 回答 3

4

SUM作为输入对进行操作,但您将其传递给字段 ' size'。
尝试消除嵌套的 foreach 并使用:

a = foreach groupedIp generate SUM(splitDate.size);
于 2013-05-06T20:20:35.193 回答
1

做一些数据转储。我敢打赌,该size列中的某些内容是非整数,而 Pig 会遇到这种情况并死掉。您还可以编写自己的 isInteger udf 代码,以便在其余处理之前检查这一点,并丢弃任何非整数。

于 2013-05-06T19:18:41.810 回答
1

SUMAVG并且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);
于 2014-10-16T20:31:32.993 回答