检索PIG中最常出现的值

时间:2012-05-07 23:35:24

标签: hadoop apache-pig

如果我有以下数据集:

c1   c2
---  ---
1    5
1    5
1    6
2    9
2    9
3    1
3    2

我想为第一列(c1)中的每个值返回第二列(c2)中最常出现的值。所以我希望返回的数据集如下所示:因为对于c1 = 1,值“5”出现两次而值“6”仅出现一次而对于c1 = 2,“9”的值出现两次且没有出现其他价值:

1    5
2    9
3    1

我遇到问题的情况是出现次数相等(在这种情况下c1 = 3)。在c2 = 3的情况下,c2中出现的数值相等,只想要返回第一个匹配项。

任何想法都会有所帮助。

2 个答案:

答案 0 :(得分:2)

假设您在A:

上有c1和c2
B = GROUP A BY (c1, c2)
C = FOREACH B GENERATE GROUP, COUNT(A) as num;

D = GROUP C BY GROUP.c1
E = FOREACH D {
    SA = ORDER C BY num DESC;
    SB = LIMIT SA 1;
    GENERATE FLATTEN(SB.group);
}

应该解决你的问题。 (我在记事本中写道,你应该通过describe /说明检查是否需要展平)

答案 1 :(得分:1)

对于像我这样的新手语言,并试图了解上面代码中发生了什么,我的评论版本(添加了描述和转储输出):

Data Samle(' sample_data / test_limiting.pig'):

1|5
1|5
1|6
2|9
2|9
3|1
3|2

猪脚本身:

A = LOAD 'sample_data/test_limiting.pig' USING PigStorage('|') AS (c1:int, c2:int);
----
-- A: {c1: int,c2: int}
----
-- (1,5)
-- (1,5)
-- (1,6)
-- (2,9)
-- (2,9)
-- (3,1)
-- (3,2)


B = GROUP A BY (c1, c2);
----
-- B: {group: (c1: int,c2: int),A: {(c1: int,c2: int)}}
----
-- ((1,5),{(1,5),(1,5)})
-- ((1,6),{(1,6)})
-- ((2,9),{(2,9),(2,9)})
-- ((3,1),{(3,1)})
-- ((3,2),{(3,2)})


C = FOREACH B GENERATE group, COUNT(A) as num;
----
-- C: {group: (c1: int,c2: int),num: long}
----
-- ((1,5),2)
-- ((1,6),1)
-- ((2,9),2)
-- ((3,1),1)
-- ((3,2),1)


D = GROUP C BY group.c1;
----
-- D: {group: int,C: {(group: (c1: int,c2: int),num: long)}}
----
-- (1,{((1,5),2),((1,6),1)})
-- (2,{((2,9),2)})
-- (3,{((3,1),1),((3,2),1)})


E = FOREACH D {
    SA = ORDER C BY num DESC;
    SB = LIMIT SA 1;
    GENERATE FLATTEN(SB.group);
}
----
-- E: {null::group: (c1: int,c2: int)}
----
-- ((1,5))
-- ((2,9))
-- ((3,1))
是的,我需要写一个参考'组'小写,因为它与大写变体轰炸。也许是由于版本不同,不知道。