Hive管理表和外部表的区别

前言:
所谓外部表,就是Hive并非认为其完全拥有这份数据。删除该表并不会删除掉这份数据,不过描述表的元数据信息会被删除掉。关于Hive数据仓库的管理表(MANAGED_TABLE)和外部表(EXTERNAL_TABLE)的区别,在创表的时候,如果不指定,则默认创建管理表。如果不知道此表是什么类型的表的话,可以在hive的命令行里打desc formatted table_name查看TABLE TYPE行查看;如果需要创建外部表则需要在创表的语句指定为external,如:create external table table_name。

案例:
1.管理表
我现在有一份名为student.txt,内容如下:
1001 lisi
1002 wangwu
1003 zhaoliu
我把他上传到hdfs上的/student目录下:

hive (default)> dfs -mkdir /student;
hive (default)> dfs -put /opt/module/datas/student.txt /student;

然后创建一个普通表(即默认管理表),并指定用/student下的数据为表数据:

hive (default)> create table stu(
id int, 
name string) 
row format delimited fields terminated by '\t' 
location '/student';

查看表数据:

hive (default)> select * from stu_;
OK
stu_.id stu.name
1001    lisi
1002    wangwu
1003    zhaoliu

说明已经成功引用了student.txt的数据,现在来删除表,drop table stu;然后再去hdfs上查看刚上传的student.txt文件,发现连/student都已经不见了。
2.外部表
先上传student.txt文件到hdfs:

hive (default)> dfs -mkdir /student;
hive (default)> dfs -put /opt/module/datas/student.txt /student;

然后创建外部表,指定student目录下的student.txt作为数据:

hive (default)> create external table stu_external(
id int, 
name string) 
row format delimited fields terminated by '\t' 
location '/student';

查看表数据:

hive (default)> select * from stu_external;
OK
stu_external.id stu_external.name
1001    lisi
1002    wangwu
1003    zhaoliu

删除表:

drop table stu_external;

删除外部表后,发现student.txt文件还在,其实外部表删除后,只删除metadata中stu_external的元数据,hdfs的数据还在。

管理表和外部表的转换
管理表转换为外部表:

alter table table_name set tblproperties('EXTERNAL'='TRUE');

外部表转换为管理表:

alter table student2 set tblproperties('EXTERNAL'='FALSE');
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章