我想用 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 的第一个组语句之后,生成其他列也是如此,这就是您将 avg 和 col6 保持相同关系的方式。
- 加载您的数据
- 根据需要对数据进行分组
- 计算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;
};
的 link
这是我的代码:
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 的第一个组语句之后,生成其他列也是如此,这就是您将 avg 和 col6 保持相同关系的方式。
- 加载您的数据
- 根据需要对数据进行分组
- 计算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;
};
的 link