Hive INSERT OVERWRITE是否保证没有重复的行?

问题描述 投票:1回答:1

[当我们使用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_atable_b没有重复项。执行此sql时,一个任务失败,但整个作业最终成功。我们还发现table_c位置下的三个文件:000000_0000000_0_copy_1000000_1。任务失败并重试会导致重复吗?

非常感谢。

hive sql-insert
1个回答
0
投票

在某些情况下,即使从重复数据删除表中未失败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;
© www.soinside.com 2019 - 2024. All rights reserved.