目录
一、hive 内部表简介
1.1 查看内部表信息
二、hive 外部表简介
三、内部表与外部表对比
四、内部表与外部表操作演示
4.1 内部表操作
4.1.1 数据准备
4.1.2 建表sql
4.2 外部表操作
4.2.1 建表sql
4.2.2 上传数据文件到 /stu目录
4.2.3 内部表删除
4.2.4 外部表删除
4.3 如何选择内、外部表
五、内部表、外部表与location的关系
5.1 location关键字不补充说明
5.2 操作演示
5.2.1 创建外部表,不指定location
5.2.2 创建内部表,指定location
一、hive 内部表简介
内部表(Internal table)也称为被Hive拥有和管理的托管表(Managed table)
默认情况下创建的表就是内部表,Hive拥有该表的结构和文件。换句话说,Hive完全管理表(元数据和数据)的生命周期,类似于RDBMS中的表。当删除内部表时,它会删除数据以及表的元数据。
还记得上一篇中关于hive建表的完整语法树吗,在建表sql中第一行提供了可选参数 EXTERNAL
CREATE [TEMPORARY] [EXTERNAL] TABLE [IF NOT EXISTS] [db_name.]table_name
...
1.1 查看内部表信息
可以使用DESCRIBE FORMATTED tablename,来获取表的元数据描述信息,从中可以看出表的类型;
二、hive 外部表简介
外部表(External table)中的数据不是Hive拥有或管理的,只管理表元数据的生命周期。
要创建一个外部表,需要使用EXTERNAL语法关键字,删除外部表只会删除元数据,而不会删除实际数据。在Hive外部仍然可以访问实际数据
实际场景中,外部表搭配location语法指定数据的路径,可以让数据更安全。
外部表不补充说明
1、创建外部表 需要关键字 external
2、外部表数据存储路径不指定 默认规则和内部表一致
3、也可以使用location关键字指定HDFS任意路径
如下为一个外表表建表sql
create external table student_ext(
num int,
name string,
sex string,
age int,
dept string)
row format delimited
fields terminated by ','
location '/stu';
三、内部表与外部表对比
- 无论内部表还是外部表,Hive都在Hive Metastore中管理表定义、字段类型等元数据信息;
- 删除内部表时,除了会从Metastore中删除表元数据,还会从HDFS中删除其所有数据文件;
- 删除外部表时,只会从Metastore中删除表的元数据,并保持HDFS位置中的实际数据不变;
四、内部表与外部表操作演示
4.1 内部表操作
4.1.1 数据准备
如下,为表映射的数据文件内容;
4.1.2 建表sql
默认情况下 ,不指定external,创建的表就是内部表
create table student(
num int,
name string,
sex string,
age int,
dept string)
row format delimited
fields terminated by ',';
在hive的客户端的执行表的创建
也可以使用desc命令查看创建的表信息
describe formatted student;
4.2 外部表操作
4.2.1 建表sql
create external table student_ext(
num int,
name string,
sex string,
age int,
dept string)
row format delimited
fields terminated by ','
location '/stu';
外部表补充说明
- 创建外部表 需要关键字 external;
- 外部表数据存储路径不指定 默认规则和内部表一致;
- 也可以使用location关键字指定HDFS任意路径;
注意:如果未提前在hdfs目录创建出location里面的目录,建表的时候会自动创建
也可以使用describe命令查看详细信息
4.2.2 上传数据文件到 /stu目录
上传外部表数据文件
hdfs dfs -put ./students.txt /stu
上传内部表数据文件
hdfs dfs -put ./students.txt /user/hive/warehouse/test.db/student
上传完成后就可以直接查看表数据了
4.2.3 内部表删除
接下来我们执行一下drop table tablename 命令,分别在Hive中和HDFS中查看效果
在当前的数据库下该表被删除了,切换到hdfs目录下查看,表对应的数据文件也删掉了;
简单来说就是,内部表执行删除的时候,hive会将内部表自身的元数据信息,连同hdfs数据文件一并删除;
4.2.4 外部表删除
删除外部表后再次去hdfs目录查看,发现此时数据文件仍然存在;
总结来说就是,删除外部表时只删除hive上的元数据信息,hdfs上面的数据仍然保留,因为这个特性,可以一定程度上确保原始数据的安全性;
4.3 如何选择内、外部表
根据上面的操作演示,在内部表与外部表的选择上做如下的建议:
- 当需要通过Hive完全管理控制表的整个生命周期时,请使用内部表;
- 当数据来之不易,防止误删,请使用外部表,因为即使删除表,文件也会被保留;
五、内部表、外部表与location的关系
通过上面的操作演示,好奇的同学不仅会在脑海里冒出下面的几个思考:
- 在创建外部表的时候,可以使用location指定存储位置路径,如果不指定会如何?
- 创建内部表的时候,是否可以使用location指定?
- 是否意味着Hive表的数据在HDFS上的位置不是一定要在/user/hive/warehouse下?
5.1 location关键字不补充说明
1)在创建外部表的时候,可以使用location指定存储位置路径,如果不指定会如何?
如果不指定location,外部表的默认路径也是位于/user/hive/warehouse,由默认参数控制
2)创建内部表的时候,是否可以使用location指定?
内部表可以使用location指定位置的
3)是否意味着Hive表的数据在HDFS上的位置不是一定要在/user/hive/warehouse下?
不一定,Hive中表数据存储位置,不管内部表还是外部表,默认都在/user/hive/warehouse,当然可以在建表的时候通过location关键字指定存储位置在HDFS的任意路径
5.2 操作演示
5.2.1 创建外部表,不指定location
create external table student_ext_nolocation(
num int,
name string,
sex string,
age int,
dept string)
row format delimited
fields terminated by ',';
执行创建表的sql;
再在hdfs目录中检查,发现就在默认的路径下:/user/hive/warehouse/test.db
5.2.2 创建内部表,指定location
create table student_inner(
num int,
name string,
sex string,
age int,
dept string)
row format delimited
fields terminated by ','
location '/stu';
执行sql创建表,可以看到这种操作是可以的;