SQL表一共有几种写入方式
SQL表一共有几种写入方式
- **1. `INSERT OVERWRITE TABLE`(覆盖写入)**
- **2. `INSERT INTO TABLE`(追加写入)**
- **3. `INSERT OVERWRITE DIRECTORY`(导出数据到文件)**
- **4. `CREATE TABLE AS SELECT`(CTAS,建表并写入)**
- **总结对比**
- **如何选择?**
在 Hive SQL(以及 Spark SQL)中,数据写入表的方式主要有 4 种,具体如下:
1. INSERT OVERWRITE TABLE
(覆盖写入)
特点:
- 先删除目标表的全部数据(或指定分区的数据),再写入新数据。
- 适用于全量数据刷新(如每日全量更新)。
- 如果表是分区表,可以指定分区覆盖。
语法:
-- 覆盖全表
INSERT OVERWRITE TABLE table_name
SELECT ... FROM ...;-- 覆盖指定分区(动态分区)
INSERT OVERWRITE TABLE table_name PARTITION(dt='20250905')
SELECT ... FROM ...;
适用场景:
- 每日全量数据更新(如用户画像表)。
- 临时表数据刷新(如
adhoctemp
表)。
2. INSERT INTO TABLE
(追加写入)
特点:
- 不删除旧数据,新数据直接追加到表末尾。
- 适用于增量数据写入(如日志表、流水表)。
- 可以指定分区追加数据。
语法:
-- 追加数据到全表
INSERT INTO TABLE table_name
SELECT ... FROM ...;-- 追加数据到指定分区
INSERT INTO TABLE table_name PARTITION(dt='20250905')
SELECT ... FROM ...;
适用场景:
- 日志表(如用户行为日志)。
- 增量数据存储(如订单流水表)。
3. INSERT OVERWRITE DIRECTORY
(导出数据到文件)
特点:
- 将查询结果写入 HDFS 或云存储(如 S3、OSS)的指定目录。
- 不会影响表数据,仅用于数据导出。
- 支持多种文件格式(如 CSV、Parquet、ORC)。
语法:
-- 导出数据到 HDFS 目录(默认格式为 TEXT)
INSERT OVERWRITE DIRECTORY '/path/to/output'
SELECT ... FROM ...;-- 导出为 Parquet 格式
INSERT OVERWRITE DIRECTORY '/path/to/output'
STORED AS PARQUET
SELECT ... FROM ...;
适用场景:
- 数据导出到外部系统(如数据分析、机器学习)。
- 备份数据到文件系统。
4. CREATE TABLE AS SELECT
(CTAS,建表并写入)
特点:
- 直接创建新表并写入数据(无需提前建表)。
- 适用于临时分析表或数据转换。
- 可以指定存储格式(如 Parquet、ORC)。
语法:
-- 创建新表并写入数据
CREATE TABLE new_table
STORED AS PARQUET
AS
SELECT ... FROM ...;
适用场景:
- 临时分析表(如
adhoctemp
表)。 - 数据转换(如 ETL 中间表)。
总结对比
写入方式 | 特点 | 适用场景 |
---|---|---|
INSERT OVERWRITE TABLE | 覆盖旧数据 | 全量数据更新(如每日快照) |
INSERT INTO TABLE | 追加新数据 | 增量数据(如日志、流水) |
INSERT OVERWRITE DIRECTORY | 导出到文件 | 数据备份、外部使用 |
CREATE TABLE AS SELECT (CTAS) | 建表并写入 | 临时表、ETL 中间表 |
如何选择?
- 需要全量替换数据? →
INSERT OVERWRITE TABLE
- 需要增量追加数据? →
INSERT INTO TABLE
- 需要导出数据到文件? →
INSERT OVERWRITE DIRECTORY
- 需要快速创建临时表? →
CREATE TABLE AS SELECT
在你的例子中,如果 tmp_z00943176_20250905_nbcb_ana_sample_did
是临时分析表,通常更适合用 INSERT OVERWRITE TABLE
(全量刷新) 或 CREATE TABLE AS SELECT
(直接建表)。