删除 apache pig 中的重复行

Posted

技术标签:

【中文标题】删除 apache pig 中的重复行【英文标题】:Remove the duplicate row in apache pig 【发布时间】:2015-03-26 13:45:54 【问题描述】:

我想删除 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,模式是(id,f4)

3,2015-02-20

即id=3有重复数据。

这是我的解决方法

r1 = LOAD 'data' USING PigStorage(',');
r2 =  group r1 by ($0,$1,$2);
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.$2),flatten(r1.$4);
;

r7= distinct dups_id

dump r7

no_dups = FOREACH r4 
sorted = ORDER r1 by $3 ASC;
lim = limit sorted 1;
GENERATE flatten(lim);
;

r8 = union no_dups,r6

dump r8

我认为这有点复杂,我怀疑性能。

还有其他更好的想法可以实现这个用例吗?

【问题讨论】:

【参考方案1】:

我会这样做。

r1 = LOAD 'data' USING PigStorage(',');
r2 = group r1 by ($0,$1,$2);
r3 = FOREACH r2 GENERATE $0.., SIZE($1) 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($1);
dups3 = FOREACH dups2 GENERATE $2, $4;
dups_id = DISTINCT dups3;

dump r8;
dump dups_id;

【讨论】:

它将输出 2015-03-30 10:24:00,919 [main] ERROR org.apache.pig.tools.grunt.Grunt - ERROR 1200: could not instantiate 'TOP' with arguments '[ ASC]' 看起来这个功能是 0.14.0 附带的。您可以将 TOP 替换为 ORDER BY ASC;和限制 1。

以上是关于删除 apache pig 中的重复行的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 apache pig 将标题行加入多个文件中的详细行

同时删除两列中的重复行[重复]

如何删除表中的重复行[重复]

删除sql查询中的重复行[重复]

如何从 SQL Server 中的表中删除重复行 [重复]

根据条件 pandas 删除 DataFrame 中的重复行