[当我们使用insert overwrite
时,我们发现了很多重复项。我们的SQL非常简单:
insert overwrite table table_c
select
table_a.id
table_a.name
from table_a
left outer join table_b
on table_a.id = table_b.id
where table_b.id is null;
table_a
和table_b
没有重复项。执行此sql时,一个任务失败,但整个作业最终成功。我们还发现table_c位置下的三个文件:000000_0
,000000_0_copy_1
,000000_1
。任务失败并重试会导致重复吗?
非常感谢。
在某些情况下,即使从重复数据删除表中未失败INSERT OVERWRITE
,也可能导致重复。
例如,此行为:如果将BIGINT
值插入Int
,则值将被静默截断以适合int,并且可能会复制新产生的值。
另外,如果您在DISTRIBUTE BY中使用诸如rand()之类的不确定函数,容器重新启动可能导致相同的行计算方式不同,并在重新启动后分配给不同的reducer,这将产生重复项。但是您没有使用此功能。
您的情况应该没问题。失败的任务将重新启动,其结果将被丢弃,并且不会影响最终结果。由于节点故障,长时间运行的任务而没有心跳,重新启动后未重现的某些运行时错误(例如OOM,任务尝试被其他进程终止,AWS集群中的竞价节点丢失)等原因,故障很可能发生。成功执行,应该没问题。文件也将在整个作业结束时写入,它们将从临时位置复制到表位置。
原因可能是连接键重复。检查此:
select id, count(*) cnt from table_b group by id having count(*)>1 order by cnt desc limit 100;