【问题标题】:Does Hive INSERT OVERWRITE guarantee no duplicate row?Hive INSERT OVERWRITE 是否保证没有重复行?
【发布时间】:2023-04-05 19:52:02
【问题描述】:

当我们使用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执行的时候,一个task失败了,但是最后整个job都成功了。 而且我们还发现了table_c位置下的三个文件: 000000_0000000_0_copy_1000000_1。 任务失败并重试是否会导致重复?

非常感谢。

【问题讨论】:

  • 我遇到了同样的问题。我的治疗是完全确定的。有时我会遇到简单的“将表 B 创建为从 A 中选择 *”的问题。有时可以,有时不行。每次我观察到这一点时,我都会看到一些被杀死的容器。

标签: hive sql-insert


【解决方案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;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-28
    • 1970-01-01
    • 1970-01-01
    • 2015-12-23
    • 1970-01-01
    • 2023-02-16
    相关资源
    最近更新 更多