如何在猪中使用 CASE 语句?
How to use CASE statement in pig?
我需要以下输出。
NE 50
SE 80
我正在使用猪查询来根据区域统计国家/地区。
c1 = group country by zone;
c2 = foreach c1 generate COUNT(country.zone), (
case country.zone
when 1 then 'NE'
else 'SE'
);
但是我无法实现我的输出。我收到如下错误:
2016-03-30 13:57:16,569 [main] ERROR org.apache.pig.tools.grunt.Grunt - ERROR 1039: (Name: Equal Type: null Uid: null)incompatible types in Equal Operator left hand side:bag :tuple(zone:int) right hand side:int
Details at logfile: /home/cloudera/pig_1459370643493.log
但我能够使用以下查询来完成。
c2 = foreach c1 generate group, COUNT(country.zone);
这将给出以下输出:
(1,50)
(2,80)
如何添加 NE 而不是 1 和 SE 而不是 2?我认为使用 CASE 会有所帮助,但我遇到了错误。有人可以帮忙吗?
编辑
Pig 0.12.0版本现在支持CASE表达式。
c2 = FOREACH c1 GENERATE (CASE group
WHEN 1 THEN 'NE'
WHEN 2 THEN 'SE'
WHEN 3 THEN 'AE'
ELSE 'VR' END), COUNT(country.zone);
旧猪版本
Pig 没有案例 statement.Your 最好的选择是使用 UDF.If 组值仅限于两个然后你可以使用 bincond 运算符来检查值
c2 = foreach c1 generate (group == 1 ? 'NE' : 'SE'), COUNT(country.zone);
如果您有多个值,则使用this.I已使用的测试值生成输出。
输入
c2 = FOREACH c1 GENERATE (group == 1 ? 'NE' :
(group == 2 ? 'SE' :
(group == 3 ? 'AE' : 'VR'))), COUNT(country.zone);
输出
在 Pig 12 及更高版本中,您可以在 pig 中使用 case 语句
在你的情况下,country.zone 是一个包,你不能将它与 int
进行比较
上面发布的答案出现此错误。
mismatched input ')' expecting END.
因此更新工作代码:
c2 = FOREACH c1 GENERATE (CASE group
WHEN 1 THEN 'NE'
WHEN 2 THEN 'SE'
WHEN 3 THEN 'AE'
ELSE 'VR' END), COUNT(country.zone);
输出:
(NE, 50)
(SE, 80)
(AE, 30)
我需要以下输出。
NE 50
SE 80
我正在使用猪查询来根据区域统计国家/地区。
c1 = group country by zone;
c2 = foreach c1 generate COUNT(country.zone), (
case country.zone
when 1 then 'NE'
else 'SE'
);
但是我无法实现我的输出。我收到如下错误:
2016-03-30 13:57:16,569 [main] ERROR org.apache.pig.tools.grunt.Grunt - ERROR 1039: (Name: Equal Type: null Uid: null)incompatible types in Equal Operator left hand side:bag :tuple(zone:int) right hand side:int
Details at logfile: /home/cloudera/pig_1459370643493.log
但我能够使用以下查询来完成。
c2 = foreach c1 generate group, COUNT(country.zone);
这将给出以下输出:
(1,50)
(2,80)
如何添加 NE 而不是 1 和 SE 而不是 2?我认为使用 CASE 会有所帮助,但我遇到了错误。有人可以帮忙吗?
编辑
Pig 0.12.0版本现在支持CASE表达式。
c2 = FOREACH c1 GENERATE (CASE group
WHEN 1 THEN 'NE'
WHEN 2 THEN 'SE'
WHEN 3 THEN 'AE'
ELSE 'VR' END), COUNT(country.zone);
旧猪版本
Pig 没有案例 statement.Your 最好的选择是使用 UDF.If 组值仅限于两个然后你可以使用 bincond 运算符来检查值
c2 = foreach c1 generate (group == 1 ? 'NE' : 'SE'), COUNT(country.zone);
如果您有多个值,则使用this.I已使用的测试值生成输出。
输入
c2 = FOREACH c1 GENERATE (group == 1 ? 'NE' :
(group == 2 ? 'SE' :
(group == 3 ? 'AE' : 'VR'))), COUNT(country.zone);
输出
在 Pig 12 及更高版本中,您可以在 pig 中使用 case 语句
在你的情况下,country.zone 是一个包,你不能将它与 int
进行比较上面发布的答案出现此错误。
mismatched input ')' expecting END.
因此更新工作代码:
c2 = FOREACH c1 GENERATE (CASE group
WHEN 1 THEN 'NE'
WHEN 2 THEN 'SE'
WHEN 3 THEN 'AE'
ELSE 'VR' END), COUNT(country.zone);
输出:
(NE, 50)
(SE, 80)
(AE, 30)