首页/数据/数仓建模速查/Hive 表类型:内部表与外部表
湖仓与引擎63 条

Hive 表类型:内部表与外部表

内部表由 Hive 管理数据生命周期,DROP 会删数据;外部表只管理元数据,DROP 保留数据;数仓贴源层用外部表更安全。

数仓建模速查数据更新于 2026-10-13

内部表与外部表是什么

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 数据会一并删除,只能回源系统重刷。

易错点

  • 贴源层建成内部表:DROP TABLE 连数据目录一起删除,只能从源系统重新同步
  • 外部表建完不修分区:目录里有文件但元数据没有分区,查询返回 0 行却误判为链路断了
  • 手工用 HDFS 命令直接改写外部表目录且目录名不符合 dt=值 结构,MSCK 修出大量空分区,只能逐个 ADD PARTITION 纠正
  • 为省事把加工层也建成外部表:DROP 表后数据目录残留,长期占用存储且无人认领

数据来源与参考

  • Apache Hive 官方文档:Managed vs External Tables
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌