猪条件陈述

时间:2015-01-12 10:21:56

标签: hadoop apache-pig

我想我已经知道了这个问题的答案,但我只想在放弃之前检查一下并做一些丑陋的事情。

我有一个查询需要计算总点击次数,还有不同的用户总数。点击总数只是这段代码没有明确的:

report              = FOREACH report GENERATE user, genre, title;
report              = DISTINCT report;
report              = GROUP report BY (genre, title);

我的问题基本上是:有没有办法编写一个条件语句来跳过这个过程中的DISTINCT步骤?伪:

report              = FOREACH report GENERATE user, genre, title;
if $report_type == 'users':
    report              = DISTINCT report;
end if
report              = GROUP report BY (genre, title);

我宁愿没有两个单独的文件,到目前为止,我能找到的唯一解决方案是使用Python等包装器来动态处理它。我宁愿将所有内容保存在一个简单的.pig文件中,但找不到办法。

1 个答案:

答案 0 :(得分:2)

一种选择是你可以尝试这样的事情。你能查看一下你的输入吗?

<强>输入

user1,action,aa
user2,comedy,cc
user3,drama,dd
user1,action,aa
user1,action,aa
user2,comedy,cc

<强> PigScript:

A = LOAD 'input' USING PigStorage(',') AS (user, genre, title);
B = FOREACH A GENERATE user, genre, title;
C = GROUP B BY (genre, title);
D = FOREACH C {
                noDistValue = FOREACH B GENERATE user,genre,title;
                distValue =  DISTINCT B;
                GENERATE $0 AS grp,noDistValue,distValue;
              }
E = FOREACH D GENERATE grp,(('$report_type' == 'users')?distValue:noDistValue) AS mybag;
DUMP E;

<强>输出1:
&gt;&gt; pig -x local -param&#34; report_type = users&#34; test.pig

((action,aa),{(user1,action,aa)})
((comedy,cc),{(user2,comedy,cc)})
((drama,dd),{(user3,drama,dd)})

<强>输出2:
&gt;&gt; pig -x local -param&#34; report_type = nonusers&#34; test.pig

((action,aa),{(user1,action,aa),(user1,action,aa),(user1,action,aa)})
((comedy,cc),{(user2,comedy,cc),(user2,comedy,cc)})
((drama,dd),{(user3,drama,dd)})

如果你想计算Count然后投影关系E,你也可以根据需要修改上面的脚本。