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

Posted

技术标签:

【中文标题】使用 pig 脚本计算字段的不同值的计数【英文标题】:Calculate count of distinct values of a field using pig script 【发布时间】:2012-10-15 11:25:40 【问题描述】:

对于表单的文件

A B user1
C D user2
A D user3
A D user1

我想计算字段 3 的不同值的计数,即count(distinct(user1, user2,user2,user1)) = 3

我正在使用以下猪脚本进行此操作

A =  load 'myTestData' using PigStorage('\t') as (a1,a2,a3); 

user_list = foreach A GENERATE $2;
unique_users = DISTINCT user_list;
unique_users_group = GROUP unique_users ALL;
uu_count = FOREACH unique_users_group GENERATE COUNT(unique_users);
store uu_count into 'output';

有没有更好的方法来计算字段的不同值?

【问题讨论】:

【参考方案1】:

一种更新的方法:

user_data = LOAD 'myTestData' USING PigStorage('\t') AS (a1,a2,a3);
users = FOREACH user_data GENERATE a3;
uniq_users = DISTINCT users;
grouped_users = GROUP uniq_users ALL;
uniq_user_count = FOREACH grouped_users GENERATE COUNT(uniq_users);
DUMP uniq_user_count;

这将在您的日志中留下值 (3)

【讨论】:

GENERATE COUNT(c) 中的 c 是什么?我认为应该是 COUNT(uniq_users)。【参考方案2】:

我这里有一个更简洁的。您可能想检查哪个运行得更快。

A =  LOAD 'myTestData' USING PigStorage('\t') AS (a1,a2,a3);
unique_users_group = GROUP A ALL;
uu_count = FOREACH unique_users_group user = A.a2; uniq = distinct user; GENERATE COUNT(uniq);;
STORE uu_count INTO 'output';

【讨论】:

这是不对的。您需要将 A 重命名为 unique_users 或反之亦然并保持一致。您对distinct 的使用也不正确:它应该是uniq = DISTINCT user,并且不会在当前条件下解析。

以上是关于使用 pig 脚本计算字段的不同值的计数的主要内容,如果未能解决你的问题,请参考以下文章

Django Query 获取 ArrayField 列的所有不同值的计数

mongodb count 每个字段/键的不同值的数量

pig latin - 计数不同并分组

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

基于第二个参数的不同值的计数

Pig 脚本到日期转换问题导致不同的输出