hadoop - 如何在 pig 中使用 CASE 语句?

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

最佳答案

编辑

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 版本

Pig 没有 case 语句。你最好的选择是使用 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

关于hadoop - 如何在 pig 中使用 CASE 语句?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36319845/

相关文章:

hadoop - 执行 pig 脚本时出错?

sql - Hive 划分同一列的数字

hadoop - 彼此之间在一分钟之内发生的 pig 重复数据删除事件

hadoop - 如何监控集群的HDFS复制进度?

hadoop - 将默认配置单元结果更改为某些值

java - Pig 将关系作为参数传递给 UDF

hadoop - Pig:如何列出Hive分区以及如何向Hive添加新分区

hadoop - 如何使用 pig 脚本从网络爬网数据中提取特定数据(nutch)

sql - SQL/HQL总数未在联接上工作

hadoop - 将SAS数据集加载到Hadoop中