内部表与外部表是什么
Hive 表按数据归属分两类。内部表(MANAGED_TABLE,旧称管理表)由 Hive 同时管理元数据与数据目录,DROP TABLE 会把元数据和 HDFS 上的数据文件一起删除;外部表(EXTERNAL_TABLE)只让 Hive 管理元数据,DROP TABLE 仅删元数据,数据目录原样保留。建表不加关键字就是内部表,要建成外部表必须显式写 EXTERNAL 并用 LOCATION 指定目录。判断一张表属于哪类,用 DESCRIBE FORMATTED 看 Table Type 字段,或用 SHOW CREATE TABLE 看语句里有没有 EXTERNAL。
基本信息
| 适用平台 | Apache Hive 2.x/3.x、Hive on Spark;Spark SQL 表属性里也有对应的 managed/external 区分 |
|---|---|
| 默认类型 | 内部表(建表不写 EXTERNAL) |
| 关键语法 | CREATE EXTERNAL TABLE ... LOCATION 'hdfs 路径' |
| 判断方式 | DESCRIBE FORMATTED 表名,看 Table Type |
| 权限要求 | 建表需库级 CREATE 权限;建外部表还需目标目录的读写权限 |
| 分区目录约定 | dt=2026-10-12 形式,便于用 MSCK 重建分区元数据 |
典型使用场景
- ODS 贴源层用外部表:数据由采集程序或同步工具直接写进目录,Hive 只负责登记和查询,表被误删时源数据仍在
- DWD/DWS 加工层用内部表:数据由 Hive 或 Spark 作业产出,表就是数据的唯一归属,删表时顺带清理目录更省事
- 多引擎共用一份数据时用外部表:Hive、Spark、Flink 读同一路径,避免任一方 DROP 影响其他引擎
- 数据目录由外部系统(对象存储挂载、迁移工具、数据交换平台)管理时用外部表,Hive 不参与目录生命周期
- 临时分析表、结果表用内部表:用完即删,数据随之回收,不留垃圾目录
两类表建表示例
两类表建表示例
CREATE EXTERNAL TABLE ods_order ( -- 贴源层:只登记元数据
order_id STRING COMMENT '订单号',
pay_amt STRING COMMENT '支付金额原始串',
dt STRING COMMENT '分区日期'
)
ROW FORMAT DELIMITED FIELDS TERMINATED BY ','
LOCATION '/warehouse/ods/order'; -- DROP 表后该目录仍保留
CREATE TABLE dwd_trade_order_di ( -- 加工层:Hive 全权管理
order_id STRING,
pay_amt DECIMAL(18,2)
)
PARTITIONED BY (dt STRING)
STORED AS ORC; -- DROP 表时数据文件一并删除
DESCRIBE FORMATTED ods_order; -- Table Type 显示 EXTERNAL_TABLE两类表关键差异
| 维度 | 内部表 | 外部表 |
|---|---|---|
| DROP TABLE 行为 | 删元数据并删除数据目录 | 只删元数据,数据目录保留 |
| 数据归属 | Hive 管理生命周期 | 外部系统管理,Hive 只读登记 |
| 典型位置 | DWD/DWS/ADS 加工层 | ODS 贴源层、跨引擎共享目录 |
| 误删代价 | 高,DROP 后不可逆 | 低,元数据可重建 |
| 重建元数据 | 只能重跑作业重新产出 | MSCK REPAIR 或 ADD PARTITION 复挂 |
外部表只是不删数据,并不会自动发现目录里已有的文件:目录新增后要执行 MSCK REPAIR TABLE 或 ALTER TABLE ADD PARTITION,否则查询返回 0 行,看起来像数据没到。
把承接外部数据源的贴源表建成内部表,一旦误执行 DROP TABLE,HDFS 数据会一并删除,只能回源系统重刷。