我想用 PIG 中的 AVG 替换 NULL 值

I want to replace NULL values by AVG in PIG

这是我的代码:

    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)
在 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] 错误 org.apache.pig.tools.grunt.Grunt - 错误 1200:Pig 脚本解析失败:
标量投影无效:avg:需要从关系投影列才能用作 s 卡拉 .

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

Darshan,这看起来不像是您正在尝试的逻辑问题。您可以将 NULLs 替换为 AVG 但这里的问题是列的 projection

要解决此问题,请再次访问您的代码,您可能会发现 AVG 处于不同的关系中,并且您正在从不同的关系中访问它。

在你的代码中 "avg" 是一个关系而不是一个列,如果我理解正确,在你生成 AVG 的第一个组语句之后,生成其他列也是如此,这就是您将 avgcol6 保持相同关系的方式。

  1. 加载您的数据
  2. 根据需要对数据进行分组
  3. 计算AVG并生成其他列

如果您愿意,可以在同一个 FOREACH 中应用此替换逻辑。

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

你收到错误是因为 avg 是一个关系,你需要使用关系中的一列 avg.Correct 你最后一个 PIG 语句来引用关系 avg 中的第一列,就像这样

m = foreach grp generate group, ((claims.Col6 IS NULL) ? (double)avg.[=10=] : 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.[=10=] : Col6);
             generate group, val; 
         };

这是数据集 automobile_insurance_claims.csv

的 link