配置单元插入覆盖是否保证没有重复行?

vmjh9lq9  于 2021-06-25  发布在  Hive
关注(0)|答案(1)|浏览(316)

当我们使用 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` . 任务失败并重试是否会导致重复?
非常感谢。
fjaof16o

fjaof16o1#

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

select id, count(*) cnt from table_b group by id having count(*)>1 order by cnt desc limit 100;

相关问题