我想用pig中的avg替换空值

quhf5bfb  于 2021-05-29  发布在  Hadoop
关注(0)|答案(4)|浏览(449)

这是我的密码:

claims = LOAD 'Darshan/automobile_insurance_claims.csv' USING  PigStorage(',') AS (claim_id:chararray, policy_master_id:chararray, registration_no:chararray, engine_no:chararray, chassis_no:chararray, customer_id:int, Col6:int,first_name:chararray, last_name:chararray,street:chararray,address:chararray,    city:chararray, zip:long,gender:chararray, claim_date:chararray, garage_city:chararray, bill_no:long, claim_amount:double, garage_name:chararray,claim_status:chararray);  

    grp_all = group claims all; 

    avg = foreach  grp_all generate AVG(claims.Col6); 
    grp = group claims by claim_id;  

    m = foreach grp generate group, ((Col6 IS NULL) ? avg : Col6);

结果:dump平均值#33.45

q5iwbnjs

q5iwbnjs1#

达珊,这看起来不像是你正在尝试的逻辑问题。可以用avg替换null,但这里的问题是列的投影。
为了解决这个问题,请再次访问您的代码,您可能会发现,平均值是在不同的关系,您访问它从不同的关系。
在你的代码中,“avg”是一个关系而不是一列,如果我理解正确的话,在你的第一个group语句生成avg之后,也生成其他列,这就是avg和col6在同一个关系中的方式。
加载数据
根据需要对数据进行分组
计算平均值并生成其他列
如果需要,可以在同一个foreach中应用这个replace逻辑。
如果你还面临任何问题,请告诉我。

zdwk9cvp

zdwk9cvp2#

下面是我查询的最终代码:

claims = LOAD 'Darshan/automobile_insurance_claims.csv' USING  PigStorage(',') AS 
         (claim_id:chararray, policy_master_id:chararray, registration_no:chararray, 
         engine_no:chararray, chassis_no:chararray, customer_id:int, Col6:int,
         first_name:chararray, last_name:chararray,street:chararray,address:chararray,
         city:chararray, zip:long,gender:chararray, claim_date:chararray,
         garage_city:chararray, bill_no:long, claim_amount:double,
         garage_name:chararray,claim_status:chararray);  

grp_all = group claims all; 
avg = foreach  grp_all generate AVG(claims.Col6); 
grp = group claims by claim_id; 

result = foreach grp { 
             val = foreach claims generate ((Col6 IS NULL) ? avg.$0 : Col6);
             generate group, val; 
         };

以下是数据集automobile\u insurance\u claims.csv的链接

jjjwad0x

jjjwad0x3#

--替换列6中的空值时显示以下错误(即年龄):由以下原因引起:
无效的标量投影:avg:需要从关系中投影列才能用作标量
在org.apache.pig.parser.logicalplanggenerator.var\u expr(logicalplanggenerator。java:10947)
位于org.apache.pig.parser.logicalplangerator.expr(logicalplangerator。java:10164)
在org.apache.pig.parser.logicalplanggenerator.bin\u expr(logicalplanggenerator。java:11992)
位于org.apache.pig.parser.logicalplangerator.projectable\u expr(logicalplangerator。java:11104)
在org.apache.pig.parser.logicalplanggenerator.var\u expr(logicalplanggenerator。java:10815)
位于org.apache.pig.parser.logicalplangerator.expr(logicalplangerator。java:10164)
在org.apache.pig.parser.logicalplangerator.flatten生成的\u项(logicalplangerator。java:7493)
在org.apache.pig.parser.logicalplangerator.generate\子句(logicalplangerator。java:17595)
在org.apache.pig.parser.logicalplangerator.foreach\u计划(logicalplangerator。java:15987)
在org.apache.pig.parser.logicalplangerator.foreach\ u子句(logicalplangerator。java:15854)
在org.apache.pig.parser.logicalplangerator.op\子句(logicalplangerator。java:1933)
在org.apache.pig.parser.logicalplangerator.general\语句(logicalplangerator。java:1102)
位于org.apache.pig.parser.logicalplangerator.statement(logicalplangerator。java:560)
在org.apache.pig.parser.logicalplangerator.query(logicalplangerator。java:421)
在org.apache.pig.parser.queryparserdriver.parse(queryparserdriver。java:188)
... 还有17个
2016-08-08 05:51:07297[main]error org.apache.pig.tools.grunt.grunt-错误1200:pig脚本解析失败:
无效的标量投影:avg:需要从关系中投影列才能用作标量。

第11行是:m=foreach grp generate group,((col6为空)?平均值:col6);

ewm0tg9j

ewm0tg9j4#

得到错误的原因是avg是一个关系,需要在关系avg中使用一列。请更正上一个pig语句以引用关系avg中的第一列,如下所示

m = foreach grp generate group, ((claims.Col6 IS NULL) ? (double)avg.$0 : claims.Col6);

或者,您可以命名列并引用它,如下所示

avg = foreach  grp_all generate AVG(claims.Col6) AS AVG_Col6; 
grp = group claims by claim_id;  
m = foreach grp generate group, ((claims.Col6 IS NULL) ? (double)avg.AVG_Col6 : claims.Col6);

相关问题