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');
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章