pig latin - 计数不同并分组
Posted
技术标签:
【中文标题】pig latin - 计数不同并分组【英文标题】:pig latin - count distinct and group by 【发布时间】:2016-06-15 13:18:46 【问题描述】:我有一个数据集(userid、resH、resW)
带有诸如
之类的数据(1001, 800, 600)
(1001, 800, 600)
(1002, 900, 700)
(1003, 900, 700)
(1004, 1800, 600)
(1005, 1800, 1600)
我想获取每组 resH-reshW 中不同用户的计数。
例如,具有上述数据的输出将是
800, 600, 1
900, 700, 2
1800, 600, 1
1800, 1600, 1
我尝试了类似的东西
D = group data by (resH,resW);
E = foreach D
unique = DISTINCT data.userId;
generate group, COUNT(unique) as unique_cnt;
;
但我没有得到我所期望的。
【问题讨论】:
【参考方案1】:加载数据,然后将其区分以删除重复项,然后按感兴趣的两列分组并计算用户 ID。
A = LOAD 'data.csv' USING PigStorage(',') AS (userid:int,resH:int,resW:int);
B = DISTINCT A;
C = GROUP B BY (resH,resW);
D = FOREACH C GENERATE FLATTEN(group) AS (resH,resW),COUNT(A.userid);
DUMP D;
【讨论】:
你使用的是哪个版本的猪?,D步骤确实给出了语法错误。 ERROR org.apache.pig.tools.grunt.Grunt - 错误 1000:解析时出错。在第 6 行第 33 列遇到“”。 第6行第33列是'group as'之后的字符 @Anand。使用 Flatten for group 将其分成两列。【参考方案2】:需要输出的方式:-
Alias1 = LOAD 'input.txt' USING PigStorage(',') AS (userid:int,resH:int,resW:int);
Alias2 = DISTINCT Alias1;
Alias3 = GROUP Alias2 BY (resH,resW);
Alias4 = foreach Alias3 GENERATE flatten(group),flatten(COUNT(Alias2.userid)) ;
DUMP Alias4;
or
STORE Alias4 INTO 'output.txt' USING PigStorage(',');
【讨论】:
我们是否也需要为 COUNT 设置 FLATTEN? 它的可选,flatten 写在这里只是为了以漂亮的格式显示输出。以上是关于pig latin - 计数不同并分组的主要内容,如果未能解决你的问题,请参考以下文章