删除 apache pig 中的重复行
Remove the duplicate row in apache pig
我想删除 pig 中的重复行。方法有很多,但不知道哪个更好
这里是数据集,schema是(f0,f1,id,f3,f4):
1,2,3,2015-02-21,2015-02-20
1,2,3,2015-02-22,2015-02-20
1,2,3,2015-02-23,2015-02-20
1,2,4,2015-02-24,2015-02-20
1,2,5,2015-02-25,2015-02-20
如果任何行的f0、f1和id相等,则它们被认为是重复的。我想输出其中一个 f3 最小的地方。
但是我也想输出哪些id重复了
也就是说,我将存储或转储两个关系。
其中一个关系是:
1,2,3,2015-02-21,2015-02-20
1,2,4,2015-02-24,2015-02-20
1,2,5,2015-02-25,2015-02-20
另一个是有重复行的id,schema是(id,f4)
3,2015-02-20
即id=3有重复数据
这是我的解决方法
r1 = LOAD 'data' USING PigStorage(',');
r2 = group r1 by ([=13=],,);
r3 = FOREACH r2 GENERATE COUNT(r1) as c, r1;
SPLIT r3 into r4 if c > 1, r5 if c == 1;
r6 = FOREACH r5 GENERATE flatten(r1);
dups_id = FOREACH r4 {
GENERATE flatten(r1.),flatten(r1.);
};
r7= distinct dups_id
dump r7
no_dups = FOREACH r4 {
sorted = ORDER r1 by ASC;
lim = limit sorted 1;
GENERATE flatten(lim);
};
r8 = union no_dups,r6
dump r8
我觉得这有点复杂,我怀疑性能。
有没有其他更好的想法可以实现这个用例?
这是我的做法。
r1 = LOAD 'data' USING PigStorage(',');
r2 = group r1 by ([=10=],,);
r3 = FOREACH r2 GENERATE [=10=].., SIZE() AS size;
DEFINE MYTOP TOP('ASC');
r8 = FOREACH r2 {
GENERATE MYTOP(1, 3, r1);
};
dups = FILTER r3 BY size > 1L;
dups2 = FOREACH dups GENERATE FLATTEN();
dups3 = FOREACH dups2 GENERATE , ;
dups_id = DISTINCT dups3;
dump r8;
dump dups_id;
我想删除 pig 中的重复行。方法有很多,但不知道哪个更好
这里是数据集,schema是(f0,f1,id,f3,f4):
1,2,3,2015-02-21,2015-02-20
1,2,3,2015-02-22,2015-02-20
1,2,3,2015-02-23,2015-02-20
1,2,4,2015-02-24,2015-02-20
1,2,5,2015-02-25,2015-02-20
如果任何行的f0、f1和id相等,则它们被认为是重复的。我想输出其中一个 f3 最小的地方。
但是我也想输出哪些id重复了
也就是说,我将存储或转储两个关系。
其中一个关系是:
1,2,3,2015-02-21,2015-02-20
1,2,4,2015-02-24,2015-02-20
1,2,5,2015-02-25,2015-02-20
另一个是有重复行的id,schema是(id,f4)
3,2015-02-20
即id=3有重复数据
这是我的解决方法
r1 = LOAD 'data' USING PigStorage(',');
r2 = group r1 by ([=13=],,);
r3 = FOREACH r2 GENERATE COUNT(r1) as c, r1;
SPLIT r3 into r4 if c > 1, r5 if c == 1;
r6 = FOREACH r5 GENERATE flatten(r1);
dups_id = FOREACH r4 {
GENERATE flatten(r1.),flatten(r1.);
};
r7= distinct dups_id
dump r7
no_dups = FOREACH r4 {
sorted = ORDER r1 by ASC;
lim = limit sorted 1;
GENERATE flatten(lim);
};
r8 = union no_dups,r6
dump r8
我觉得这有点复杂,我怀疑性能。
有没有其他更好的想法可以实现这个用例?
这是我的做法。
r1 = LOAD 'data' USING PigStorage(',');
r2 = group r1 by ([=10=],,);
r3 = FOREACH r2 GENERATE [=10=].., SIZE() AS size;
DEFINE MYTOP TOP('ASC');
r8 = FOREACH r2 {
GENERATE MYTOP(1, 3, r1);
};
dups = FILTER r3 BY size > 1L;
dups2 = FOREACH dups GENERATE FLATTEN();
dups3 = FOREACH dups2 GENERATE , ;
dups_id = DISTINCT dups3;
dump r8;
dump dups_id;