外部表与托管表的区别
Hive 建表时加不加 EXTERNAL,决定 DROP TABLE 时数据的命运:外部表只登记元数据、指向已有目录,删除表不会碰数据文件;托管表的数据由 Hive 管理,删除表时默认连数据目录一起清掉。判断标准很简单——这份数据是不是「只有 Hive 在用」。共享目录、上游落地数据、多引擎都要读的数据一律用外部表,只有 Hive 独占的中间结果才适合托管表。
基本信息
| 外部表 | DROP TABLE 删元数据,数据保留 |
|---|---|
| 托管表 | DROP TABLE 默认连数据目录一起删除 |
| 选择原则 | 共享/原始数据用外部表,中间结果可用托管表 |
| 分区支持 | 两者都支持分区,外部表分区同样需要登记 |
| 位置管理 | LOCATION 指定目录,ALTER TABLE SET LOCATION 可改 |
| 兼容生态 | Spark SQL、Trino 读取 Hive 元数据时行为一致 |
外部表定义与删除语义
外部表定义与删除语义
CREATE EXTERNAL TABLE ods_order (
order_id STRING,
amount DECIMAL(10,2)
) PARTITIONED BY (dt STRING)
ROW FORMAT DELIMITED FIELDS TERMINATED BY ','
LOCATION 's3a://lake/landing/orders';
DROP TABLE ods_order; -- 只删元数据,数据文件仍在
-- 换个目录继续用同一份元数据定义
ALTER TABLE ods_order SET LOCATION 's3a://lake/landing/orders_v2';典型使用场景
- 上游系统落地数据:文件由外部程序写入,只在 Hive 里登记结构
- 多引擎共读:同一目录 Spark、Trino 都要查,删除元数据不该影响别人
- 迁移过渡:目录不变、重建元数据即可切换计算侧配置
- 历史数据保全:明确不能让一次 DROP 带走原始文件
- 中间结果:只有当数据确实只由 Hive 产生和消费时,才考虑用托管表省心
行为对照
| 操作 | 外部表 | 托管表 |
|---|---|---|
| DROP TABLE | 只删元数据 | 默认删数据目录 |
| TRUNCATE TABLE | 不允许(保留数据) | 清空数据目录 |
| INSERT OVERWRITE | 写入 LOCATION 指定目录 | 写进仓库下的表目录 |
| 目录权限 | 由数据所有方控制 | 通常由 Hive 用户控制 |
| 误删风险 | 较低(数据在目录里) | 较高(可能连带数据) |
把外部表 LOCATION 指到别人结果目录,一次 INSERT OVERWRITE 就会改写对方数据。
外部表的 LOCATION 是元数据里的登记信息,删掉表不会删除目录;反过来,直接删除目录再查询会因为文件不存在而报错,目录生命周期要由数据所有方统一管理。