我在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);
最佳答案
在对数据进行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);
关于hadoop - 无法在 pig 里打字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17351332/