2016-03-30 165 views
1

我需要以下输出。如何在猪中使用CASE语句?

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会有所帮助,但我得到错误。谁能帮忙?

回答

3

EDIT

猪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); 

年长的猪版本

猪没有的情况下statement.Your最好的选择是UDF.If组值使用被限制为只有两个,那么你可以使用bincond运营商检查值

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

如果您有多个值,然后使用this.I've已使用测试值来生成输出。

输入

Input

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

输出

Output

+0

如果我需要输出如下: NE 50 SE 80 AE 50 VR 40 如何使用foreach语句来比较基于它们的所有四个和计数国家/地区的区域? – bthapa

+0

@BXT NE,SE AE,VR对应的值是多少? 1,2,3,4? –

+0

非常感谢你的这样一个明确的解释。我在Hive中使用了CASE语句,并且感到困惑。我非常感谢你的工作。你是否也有大数据和hadoop的博客,这样我就可以轻松地学习,因为我是初学者? – bthapa

0

猪12及更高版本,可以使用case语句猪

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

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); 

输出:

(NE, 50) 
(SE, 80) 
(AE, 30)