我在AVG功能中遇到错误。任何人都可以请求帮助下面的脚本:(我是否需要在加载时使用元组或包?)谢谢。
mydata = LOAD 'bigdata.txt' USING PigStorage(',') AS (stn , wban, yearmoda, temp, a , dewp :double, b , slp :double, c, stp :double, d, visib :double, e, wdsp :double, f, mxspd :double, gust :double, max :double, min :double, prcp :double, sndp :double, frshtt);
clean1 = FOREACH mydata GENERATE stn , wban, yearmoda, temp, a , dewp, b , slp, c, stp, d, visib, e, wdsp, f, mxspd, gust, max , min, prcp ,sndp , frshtt;
--clean2 = FILTER clean1 BY (temp == 9999.9);
tmpdata = FOREACH clean1 GENERATE stn, SUBSTRING(yearmoda, 0, 5) as year, temp;
C = GROUP tmpdata BY (year, temp);
avgtemp = FOREACH C GENERATE group, AVG(temp);
答案 0 :(得分:0)
您temp
编辑数据时未指定LOAD
类型。因此当Pig尝试调用AVG
函数时,它会检查要使用哪个版本(因为如果字段是int
而不是double
,它必须表现不同,例如),它无法告诉如何继续。在temp
语句中为temp:int
提供一个类型(例如LOAD
),它应该有效。
在您的情况下,您还没有正确指定字段。你需要传递AVG
一个袋来评估。您可以通过将temp
字段从C
中的记录包中投影出来构建此包。 C
的架构为{(group:(year,temp)), tmpdata:{(stn,year:chararray,temp)})}
,因此您需要像这样计算avgtemp
:
avgtemp = FOREACH C GENERATE group, AVG(tmpdata.temp);