当我们使用 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执行时,一个任务失败了,但是整个作业最终成功了。我们还发现表c位置下有三个文件: `000000_0` , `000000_0_copy_1` , `000000_1` . 任务失败并重试是否会导致重复?
非常感谢。
1条答案
按热度按时间fjaof16o1#
在某些情况下甚至没有失败
INSERT OVERWRITE
从已消除重复的表中删除可能会导致重复。例如,此行为:如果要插入
BIGINT
价值观Int
,值将自动截断以适合int,新生成的值可能会重复。另外,如果您在distribute by中使用非确定性函数(如rand()),容器重新启动可能会导致相同的行以不同的方式计算,并在重新启动后分配到不同的reducer,这将产生重复。但是你没有使用这样的功能。
对你来说应该没问题。失败的任务正在重新启动,其结果将被丢弃,并且不应影响最终结果。失败很可能是因为节点宕机,长时间运行的任务没有心跳,一些运行时错误在重新启动后没有被复制,比如oom,任务尝试被其他进程终止,aws集群中的spot节点丢失等等。如果作业成功执行,应该没问题。另外,文件在整个作业结束时被写入,它们被从临时位置复制到表位置。
原因可能是连接键中存在重复。检查此项: