ZhangZhihui's Blog  

1. 非分区表

INSERT OVERWRITE TABLE target_table
SELECT * FROM source_table;

 

  • 整个表的数据会被覆盖

  • 原来表里的所有数据都会被清空,替换成本次 SELECT 的结果。

  • 相当于 truncate + insert


2. 分区表

分区表的情况会稍微复杂一些:

(1) 没有指定分区

INSERT OVERWRITE TABLE target_partitioned_table
SELECT * FROM source_table;

 

  • 默认会清空 整个分区表 的数据,

  • 然后插入 SELECT 的结果,并自动写入到对应的分区(前提是 SELECT 语句里包含分区字段)。

  • 如果 SELECT 的结果只涉及部分分区,也依然会导致 全表数据被覆盖(这是很多人容易踩的坑 ⚠️)。


(2) 指定了分区

INSERT OVERWRITE TABLE target_partitioned_table PARTITION (dt='2025-09-12')
SELECT id, name FROM source_table;

 

  • 只会覆盖指定的分区(这里是 dt='2025-09-12')。

  • 其它分区的数据不受影响。

  • 这也是 推荐的写法,可以做到局部更新。


(3) 动态分区

SET hive.exec.dynamic.partition=true;
SET hive.exec.dynamic.partition.mode=nonstrict;

INSERT OVERWRITE TABLE target_partitioned_table PARTITION (dt)
SELECT id, name, dt FROM source_table;

 

  • dt 分区的值来自 SELECT 语句。

  • Hive 会根据结果集的 dt 值去写不同的分区。

  • 只会覆盖这些结果涉及到的分区,不会动到别的分区。


3. 核心区别总结

表类型INSERT OVERWRITE 作用范围
非分区表 覆盖整个表
分区表(不指定分区) 覆盖整个分区表(所有分区)
分区表(静态分区) 覆盖指定分区
分区表(动态分区) 覆盖结果涉及到的分区

👉 建议:

  • 非分区表没什么歧义,overwrite 就是全表覆盖。

  • 分区表几乎总是要带 PARTITION,否则容易误删全表数据。

 

posted on 2025-09-12 19:55  ZhangZhihuiAAA  阅读(29)  评论(0)    收藏  举报