Hadoop 检索PIG中最常出现的值
如果我有以下数据集:Hadoop 检索PIG中最常出现的值,hadoop,apache-pig,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中出现次数相等(c1=3)的情况下,我
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中出现次数相等(c1=3)的情况下,我只希望返回第一次出现
任何想法都会有帮助。假设您的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);
}
应该能解决你的问题。(虽然我是在记事本中写的,但您应该通过descripe/illable检查是否需要展平)对于像我这样对该语言不熟悉并试图理解上面代码中发生了什么的人,我的注释版本(添加了descripe和dump输出): 数据样本(“样本数据/测试限制.清管器”): 还有猪脚本本身:
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))
顺便说一句,我需要用小写字母写引用'group',因为它用大写的变体轰炸。可能是由于版本不同,dunno.看起来不错,但由于Pig模式引用错误,有一些小改动。“D=C组按c1”应改为:“D=C组按c1组”和“生成SB.c1,SB.c2”应改为:“生成扁平化(SB.GROUP)”非常感谢您的帮助。很好!
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))