Hadoop 我想用PIG中的平均值替换空值

Hadoop 我想用PIG中的平均值替换空值,hadoop,mapreduce,apache-pig,mean,isnull,Hadoop,Mapreduce,Apache Pig,Mean,Isnull,这是我的代码: 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:

这是我的代码:

    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);   
结果:转储平均值#33.45

------------------------------------------------------------------------------------------------------------------------------------替换Col6中的空值时显示以下错误(即年龄): 原因:
无效的标量投影:avg:需要从关系投影列,才能将其用作s 卡拉尔
位于org.apache.pig.parser.logicalplanggenerator.var_expr(logicalplanggenerator.java:10947)
位于org.apache.pig.parser.logicalplangerator.expr(logicalplangerator.java:10164)
位于org.apache.pig.parser.logicalplangerator.bin_expr(logicalplangerator.java:11992)
位于org.apache.pig.parser.logicalplanggenerator.projectable_expr(logicalplanggenerator.java:11104)
位于org.apache.pig.parser.logicalplanggenerator.var_expr(logicalplanggenerator.java:10815)
位于org.apache.pig.parser.logicalplangerator.expr(logicalplangerator.java:10164)
在org.apache.pig.parser.logicalplanggenerator.flant\u生成的\u项(logicalplanggenerator.java:7493)
位于org.apache.pig.parser.LogicalPlanGenerator.generate_子句(LogicalPlanGenerator.java:17595)
在org.apache.pig.parser.logicalplangerator.foreach_计划(logicalplangerator.java:15987)
位于org.apache.pig.parser.LogicalPlanGenerator.foreach_子句(LogicalPlanGenerator.java:15854)
位于org.apache.pig.parser.logicalplangerator.op_子句(logicalplangerator.java:1933)
位于org.apache.pig.parser.LogicalPlanGenerator.general_语句(LogicalPlanGenerator.java:1102)
位于org.apache.pig.parser.LogicalPlanGenerator.statement(LogicalPlanGenerator.java:560)
位于org.apache.pig.parser.LogicalPlanGenerator.query(LogicalPlanGenerator.java:421)
位于org.apache.pig.parser.QueryParserDriver.parse(QueryParserDriver.java:188)
... 17更多
2016-08-08 05:51:07297[main]错误org.apache.pig.tools.grunt.grunt-错误1200:pig脚本无法解析:
无效的标量投影:avg:需要从关系投影列,才能将其用作s 卡拉尔


第11行是:m=foreach grp generate group,((Col6为空)?平均值:Col6) Darshan,这看起来不像是你正在尝试的逻辑问题。您可以用AVG替换NULLs,但这里的问题是列的投影。

为了解决这个问题,请再次访问您的代码,您可能会发现AVG处于不同的关系中,您正在从不同的关系访问它

在您的代码中,“avg”是一个关系而不是一列,如果我理解正确的话,在您第一次生成avg的group语句之后,也生成其他列,这就是如何将avgcol6置于同一关系中的方式。

  • 加载数据
  • 根据需要对数据进行分组
  • 计算平均值并生成其他列
  • 如果需要,可以在相同的FOREACH中应用此替换逻辑


    如果您仍然面临任何问题,请告诉我。

    您遇到了错误,因为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);  
    
    或者,您也可以命名列并引用它,如下所示

    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);  
    

    这是我查询的最终代码:

    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; 
             };
    

    这里是数据集的链接

    m=foreach grp generate group,((claims.Col6为空)?平均$0:claims.Col6);请提供样本数据集。@ankur automobile\u insurance\u claims.csv:是的,这是我所寻找的完美解决方案。但是得到另一个错误:BinCond不支持的输入类型:left-hand-side:double;右手边:bag…….它将claims.Col6作为BagTry像这样铸造avg.avg_Col6,我怀疑它是avg_Col6而不是claims.Col6,因为claims.Col6是一个字段,它的类型是int.m=foreach grp generate group,((claims.Col6为NULL);(double)avg.avg_Col6:claims.Col6);我已经编辑了answeravg.Col6或avg.avg_Col6是可以的……它把claims.Col6当作包。我得把这个表改成双精度表。(错误:BinCond的输入类型不受支持:左手边:double;右手边:bag)您不能像avg_col6一样强制转换它吗?不。它显示出错误。不能从袋子里扔到两个袋子里。