猪条件语句

Pig Conditional Statements

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

我有一个查询需要计算总点击次数以及不同用户的总数。总点击次数就是这段代码没有区别:

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 文件中,但找不到实现它的方法。

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

输入:

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 [=11=] AS grp,noDistValue,distValue;
              }
E = FOREACH D GENERATE grp,(('$report_type' == 'users')?distValue:noDistValue) AS mybag;
DUMP E;

输出 1:
>>pig -x local -param "report_type=users" test.pig

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

输出2:
>>pig -x local -param "report_type=nonusers" 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)})

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