我想在PIG中用AVG替换NULL值

时间:2016-08-08 06:03:13

标签: 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: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 avg; #33.45

----------------------------------------------- -------------------------------------------------- ----------------------------------- 在替换Col6中的NULL值时显示以下错误(即年龄):         引起:
 无效的标量投影:avg:需要从一个关系中投射一个列,以便将其用作s 日历
        在org.apache.pig.parser.LogicalPlanGenerator.var_expr(LogicalPlanGenerator.java:10947)
        在org.apache.pig.parser.LogicalPlanGenerator.expr(LogicalPlanGenerator.java:10164)
        在org.apache.pig.parser.LogicalPlanGenerator.bin_expr(LogicalPlanGenerator.java:11992)
        在org.apache.pig.parser.LogicalPlanGenerator.projectable_expr(LogicalPlanGenerator.java:11104)
        在org.apache.pig.parser.LogicalPlanGenerator.var_expr(LogicalPlanGenerator.java:10815)
        在org.apache.pig.parser.LogicalPlanGenerator.expr(LogicalPlanGenerator.java:10164)
        在org.apache.pig.parser.LogicalPlanGenerator.flatten_generated_item(LogicalPlanGenerator.java:7493)
        在org.apache.pig.parser.LogicalPlanGenerator.generate_clause(LogicalPlanGenerator.java:17595)
        在org.apache.pig.parser.LogicalPlanGenerator.foreach_plan(LogicalPlanGenerator.java:15987)
        在org.apache.pig.parser.LogicalPlanGenerator.foreach_clause(LogicalPlanGenerator.java:15854)
        在org.apache.pig.parser.LogicalPlanGenerator.op_clause(LogicalPlanGenerator.java:1933)
        at org.apache.pig.parser.LogicalPlanGenerator.general_statement(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:07,297 [main] ERROR org.apache.pig.tools.grunt.Grunt - ERROR 1200:猪脚本无法解析:
 无效的标量投影:avg:需要从一个关系中投射一个列,以便将其用作s calar。

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

3 个答案:

答案 0 :(得分:1)

Darshan,这看起来不像你正在尝试的逻辑问题。你可以用 AVG 替换 NULL ,但这里的问题是列的投影

要解决此问题,请再次重新访问您的代码,您可能会发现AVG具有不同的关系,并且您从不同的关系中访问它。

在你的代码" avg"是一个关系而不是一个列,如果我正确地得到它,在您生成 AVG 的第一个群组声明之后,还会生成其他列,以及您将如何生成同一关系中的 avg col6

  1. 加载您的数据
  2. 根据您的需要对数据进行分组
  3. 计算AVG并生成其他列
  4. 如果您愿意,可以在相同的FOREACH中应用此替换逻辑。

    如果您仍然遇到任何问题,请告诉我。

答案 1 :(得分:1)

你得到的错误是因为avg是一个关系,你需要在关系avg.Correct中使用一个列,你的上一个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);  

答案 2 :(得分:0)

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

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_insurance_claims.csv

的链接