我在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);
当LOAD
处理数据时,您没有为temp
分配类型。因此,当Pig尝试调用AVG
函数时,它会检查要使用哪个版本的函数(例如,如果字段是int
而不是double
,它的行为必须不同),它无法判断如何继续。在LOAD
语句中给temp
一个类型(类似于temp:int
),它应该可以工作。
在您的情况下,您也没有正确指定字段。你需要通过AVG
一个袋子来评估。您可以通过将temp
字段投影到C
中的记录包中来构造此包。C
的模式是{(group:(year,temp)), tmpdata:{(stn,year:chararray,temp)})}
,所以您需要像这样计算avgtemp
:
avgtemp = FOREACH C GENERATE group, AVG(tmpdata.temp);