Hive 内部表和外部表

Hive 内部表和外部表

什么是内部表?

内部表(Internal table) 也称为被 Hive 拥有和管理的托管表(Managed table)。默认情况下创建的表就是内部表,Hive拥有该表的结构和文件。换句话说,Hive完全管理表(元数据和数据)的生命周期,类似于RDBMS中的表。

当删除内部表时,它会删除数据以及表的元数据。

1
2
3
4
5
6
7
8
create table student(
num int,
name string,
sex string,
age int,
dept string)
row format delimited
fields terminated by ',';

可以使用DESCRIBE FORMATTED itcast.student;来获取表的描述信息,从中可以看出表的类型。

image-20211114170541476

什么是外部表?

外部表(External table)中的数据不是Hive拥有或管理的,只管理表元数据的生命周期。要创建一个外部表,需要使用EXTERNAL语法关键字。

删除外部表只会删除元数据,而不会删除实际数据。 在Hive外部仍然可以访问实际数据。而且外部表更为方便的是可以搭配location语法指定数据的路径。

1
2
3
4
5
6
7
8
9
create external table student_ext(
num int,
name string,
sex string,
age int,
dept string)
row format delimited
fields terminated by ','
location '/stu';

可以使用DESC FORMATTED itcast. student_ext;来获取表的描述信息,从中可以看出表的类型。

image-20211114170631007

内部表、外部表差异

无论内部表还是外部表,Hive 都在 Hive Metastore 中管理表定义及其分区信息。删除内部表会从 Metastore 中删除表元数据,还会从 HDFS 中删除其所有数据/文件。

删除外部表,只会从Metastore中删除表的元数据,并保持HDFS位置中的实际数据不变。

内部表与外部表的区别:

内部表、托管表 外部表
创建方式 默认情况下 使用外部(External)语法关键字
Hive管理范围 元数据、表数据 元数据
删除表结果 删除元数据,删除HDFS上文件数据 只会删除元数据
操作 支持ARCHIVE, UNARCHIVE,TRUNCATE,MERGE,CONCATENATE 不支持
事务 支持ACID/事务性 不支持
缓存 支持结果缓存 不支持

如何选择内部表、外部表?

当需要通过Hive完全管理控制表的整个生命周期时,请使用内部表。

当文件已经存在或位于远程位置时,请使用外部表,因为即使删除表,文件也会被保留。


Hive 内部表和外部表
https://flepeng.github.io/045-Hive-21-命令-Hive-内部表和外部表/
作者
Lepeng
发布于
2025年1月21日
许可协议