Hadoop 如何在pig中使用CASE语句?

Hadoop 如何在pig中使用CASE语句?,hadoop,apache-pig,Hadoop,Apache Pig,我需要以下输出 NE 50 SE 80 我使用pig查询来计算基于区域的国家 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.G

我需要以下输出

NE 50
SE 80
我使用pig查询来计算基于区域的国家

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版本现在支持大小写表达式

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没有case语句。最好的选择是使用UDF。如果组值仅限于两个,则可以使用运算符检查值

c2 = foreach c1 generate (group == 1 ? 'NE' : 'SE'), 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 AE 50 VR 40如何使用foreach语句比较所有四个国家的区域并根据它们计算国家数?@BXT NE、SE AE、VR的对应值是多少?1,2,3,4?非常感谢你这么清楚的解释。我没有像在Hive中那样使用CASE语句,结果弄糊涂了。我真的很感激你的工作。您是否也有大数据和hadoop的博客,以便我作为初学者能够轻松学习?@BXT很高兴它有所帮助。我也是初学者:)
(NE, 50)
(SE, 80)
(AE, 30)