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 - 计数不同并分组的主要内容,如果未能解决你的问题,请参考以下文章

在 Pig Latin 中选择不同的行

聚合的 Pig Latin 逻辑测试

Pig:文件中不同元组的计数频率

使用 pig 脚本计算字段的不同值的计数

用 Pig Latin 为每组编写一个文件

MAX(Count) 函数 apache pig latin