这是我的代码:
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。
答案 0 :(得分:1)
Darshan,这看起来不像你正在尝试的逻辑问题。你可以用 AVG 替换 NULL ,但这里的问题是列的投影。
要解决此问题,请再次重新访问您的代码,您可能会发现AVG具有不同的关系,并且您从不同的关系中访问它。
在你的代码" avg"是一个关系而不是一个列,如果我正确地得到它,在您生成 AVG 的第一个群组声明之后,还会生成其他列,以及您将如何生成同一关系中的 avg 和 col6 。
如果您愿意,可以在相同的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;
};
的链接