猪条件语句
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,你也可以根据你的需要修改上面的脚本。
我想我已经知道了这个问题的答案,但我只是想在我放弃并做一些丑陋的事情之前检查一下。
我有一个查询需要计算总点击次数以及不同用户的总数。总点击次数就是这段代码没有区别:
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,你也可以根据你的需要修改上面的脚本。