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