Hive内部表&外部表详解

内部表(managed table): 未被external修饰的表,也叫管理表。
外部表(external table):external修饰的表。

内部表&外部表的区别:
内部表:删除表会删除表的元数据(metadata)和表数据(data)。
外部表:删除表会删除表的元数据(metadata),但不会删除表数据(data)。

数据管理方式:
数据(data)都存储在HDFS上,内部表由Hive自身管理,外部表数据由HDFS管理;
元数据(metadata)都存储在mysql上,由mysql管理。

一、内部表&外部表

1、内部表:

(1)、创建内部表:

create table student1(
id int,
name string)
row format delimited fields terminated by '\t'
stored as textfile;

Hive内部表&外部表详解_第1张图片
(2)、查看表格式化数据

desc formatted student1;

Hive内部表&外部表详解_第2张图片
可以看到这是一张内部表。

(3)、上传表数据并查询表数据存储在HDFS的文件

dfs -put /opt/module/data/student.txt /user/hive/warehouse/temp.db/student1;

在这里插入图片描述
在这里插入图片描述

(4)、查询表存储数据(DATA)

select * from  student1;

Hive内部表&外部表详解_第3张图片
(5)、查询表的元数据(METADATA),元数据在mysql

select * from tbls;

在这里插入图片描述
(6)、删除表,并查看表data和metadata。

 drop table student1;

在这里插入图片描述
删除表后hdfs的data被删除
Hive内部表&外部表详解_第4张图片
表的源数据也被删除
在这里插入图片描述
2、外部表

(1)、创建外部表:

create external table  student2(
id int,
name string)
row format delimited fields terminated by '\t'
stored as textfile
location '/tmp/student';

(2)、查看表格式化数据

desc formatted student2;
--查看表存储在HDFS的位置以及表类型。

Hive内部表&外部表详解_第5张图片
在这里插入图片描述
(3)、上传表数据并查询表数据存储在HDFS的文件

dfs -put /opt/module/data/student.txt /tmp/student;

Hive内部表&外部表详解_第6张图片
(4)查询表数据DATA
Hive内部表&外部表详解_第7张图片
(5)查询表的元数据
在这里插入图片描述
(6)、删除表,并查看表data和metadata

删除表
在这里插入图片描述
查看data,未被删除
Hive内部表&外部表详解_第8张图片
查看metadata,已被删除
在这里插入图片描述

综上:内部表被drop后,表的data和metadata都会被删除;外部表被drop后,表的metadata会被删除,但是data不会被删除。如果不小心删掉外部表,重新建表location到数据存放在HDFS的相应路径即可。

使用场景:
(1)外部表:因其指删除表时不会删除HDFS上的数据,安全性相对较高,且指定目录的特性,适合数据需要共享或者数据的处理需要 hive和其他工具一起处理的场景。

(2)内部表:对原始数据或比较重要的中间数据进行建表存储。

3、内外部表的相互转换。

(1)、将外部表转换成内部表

转换前:
Hive内部表&外部表详解_第9张图片

alter table student2 set tblproperties('EXTERNAL'='FALSE');

转换后:
Hive内部表&外部表详解_第10张图片
2、将内部表转化成外部表:

alter table student2 set tblproperties('EXTERNAL'='FALSE');

注意:(‘EXTERNAL’=‘TRUE’)和(‘EXTERNAL’=‘FALSE’)为固定写法,区分大小写!

你可能感兴趣的:(hive,hdfs,hadoop)