hive内部表和外部表
Hive 内部表 vs 外部表:建表之前,先想清楚”这数据归谁管”
Hive 建表的时候,有一个绕不开的选择:
- 内部表(MANAGED_TABLE):Hive 管数据,删表删数据
- 外部表(EXTERNAL_TABLE):用户管数据,删表不删数据
怎么选?先回答一个问题:这份数据,Hive 是”独家拥有”还是”借来用用”?
| 数据来源 | 选什么 |
|---|---|
| Flume 采集的日志、其他系统产生的原始数据 | 外部表(数据是别人的,Hive 只是借来查) |
| Hive ETL 生成的中间表、临时表、结果表 | 内部表(数据是 Hive 自己产生的,删了没关系) |
内部表:Hive 管数据,删表就删数据
内部表是 Hive 的默认表类型。建表时不加 EXTERNAL,就是内部表。
建表语法:
CREATE TABLE user_info (
id INT,
name STRING,
age INT
)
ROW FORMAT DELIMITED FIELDS TERMINATED BY ',';
数据存哪? 默认在 /user/hive/warehouse/ 下,按库名和表名组织:
/user/hive/warehouse/study_hive.db/user_info/
删表时发生什么?
DROP TABLE user_info;
- 元数据(表结构)被删
- HDFS 上的数据文件也被删
什么时候用内部表?
- ETL 过程中的中间表(算完就扔)
- 临时表(测试用,用完就删)
- Hive 自己产生的数据(不跟其他系统共享)
外部表:用户管数据,删表不删数据
外部表的数据存在 Hive 以外的地方,Hive 只是”借来查一下”。
建表语法(多了 EXTERNAL 和 LOCATION):
CREATE EXTERNAL TABLE log_data (
ip STRING,
access_time STRING,
url STRING
)
ROW FORMAT DELIMITED FIELDS TERMINATED BY ' '
LOCATION '/data/nginx/logs/2026-07-20';
数据存哪? 建表时通过 LOCATION 指定,数据已经在那个路径下了。
删表时发生什么?
DROP TABLE log_data;