如何在猪中使用CASE声明?

时间:2016-03-30 21:12:11

标签: 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.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会有所帮助,但我收到错误。有人可以帮忙吗?

3 个答案:

答案 0 :(得分:3)

修改

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没有案例陈述。您最好的选择是使用UDF。如果组值仅限于两个,那么您可以使用bincond运算符来检查值

c2 = foreach c1 generate (group == 1 ? 'NE' : 'SE'), COUNT(country.zone);

如果您有多个值,请使用此。我已使用测试值生成输出。

<强>输入

Input

c2 = FOREACH c1 GENERATE (group == 1 ? 'NE' : 
                         (group == 2 ? 'SE' :
                         (group == 3 ? 'AE' : 'VR'))), COUNT(country.zone);

<强>输出

Output

答案 1 :(得分:0)

在Pig 12及更高版本中,您可以在pig中使用case语句

在你的情况下,country.zone是一个包,你不能将它与int

进行比较

答案 2 :(得分:0)

以上发布的答案收到此错误。

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)