1. 非分区表
-
整个表的数据会被覆盖。
-
原来表里的所有数据都会被清空,替换成本次
SELECT的结果。 -
相当于 truncate + insert。
2. 分区表
分区表的情况会稍微复杂一些:
(1) 没有指定分区
-
默认会清空 整个分区表 的数据,
-
然后插入
SELECT的结果,并自动写入到对应的分区(前提是SELECT语句里包含分区字段)。 -
如果
SELECT的结果只涉及部分分区,也依然会导致 全表数据被覆盖(这是很多人容易踩的坑 ⚠️)。
(2) 指定了分区
-
只会覆盖指定的分区(这里是
dt='2025-09-12')。 -
其它分区的数据不受影响。
-
这也是 推荐的写法,可以做到局部更新。
(3) 动态分区
-
dt分区的值来自SELECT语句。 -
Hive 会根据结果集的
dt值去写不同的分区。 -
只会覆盖这些结果涉及到的分区,不会动到别的分区。
3. 核心区别总结
| 表类型 | INSERT OVERWRITE 作用范围 |
|---|---|
| 非分区表 | 覆盖整个表 |
| 分区表(不指定分区) | 覆盖整个分区表(所有分区) |
| 分区表(静态分区) | 覆盖指定分区 |
| 分区表(动态分区) | 覆盖结果涉及到的分区 |
👉 建议:
-
非分区表没什么歧义,overwrite 就是全表覆盖。
-
分区表几乎总是要带
PARTITION,否则容易误删全表数据。

浙公网安备 33010602011771号