Hive內部表和外部表的區別及如何創建

目前所創建的表都是所謂的管理表,有時也被稱爲內部表,因爲這種表,Hive會(或多或少地)控制着數據的生命週期。
當刪除一個管理表時,Hive也會刪除這個表中的數據,管理表不方便和其他工作共享數據。

內部表(internal table/managed table):

沒有external修飾,表數據保存在Hive默認的路徑下,數據完全由Hive管理,刪除表時元數據和表數據都會一起刪除。

外部表(external table):

有external修飾,表數據保存在HDFS上,該位置由用戶指定。刪除表時,只會刪除表的元數據,所以外部表不是有Hive完全管理的。

區別:

  1. 內部表數據由Hive自身管理,外部表數據由HDFS管理
  2. 內部表數據存儲的位置是hive.metastore.warehouse.dir(默認:/user/hive/warehouse)
  3. 外部表數據的存儲位置由自己制定(如果沒有LOCATION,Hive將在HDFS上的/user/hive/warehouse文件夾下以外部表的表名創建一個文件夾,並將屬於這個表的數據存放在這裏)
  4. 刪除內部表會直接刪除元數據(metadata)及存儲數據
  5. 刪除外部表僅僅會刪除元數據,HDFS上的文件並不會被刪除
  6. 對內部表的修改會將修改直接同步給元數據,而對外部表的表結構和分區進行修改,則需要修復(MSCK REPAIR TABLE table_name;)

使用場合:

1、希望做數據備份並且不經常改變的數據,存放在外部表可以減少失誤操作。
2、數據清洗轉換後的中間結果,可以存放在內部表,因爲Hive對內部表支持的功能比較全面,方便管理。
3、處理完成的數據由於需要共享,可以存儲在外部表,這樣能夠防止失誤操作,增加數據的安全性。
4、在生產中一般創建外部表來存儲數據。

舉個例子便於理解

1、創建內部表table1:

create table table1(id int,name string,
hobby array<string>,addmap<String,string>)
              > row format delimited 
              > fields terminated by ','
              > collection items terminated by '-'
              > map keys terminated by ':'
              > ;

在這裏插入圖片描述

查看錶的描述:desc table1;

desc table1;

在這裏插入圖片描述

裝載數據(table1)

注意:
一般很少用insert 語句,因爲就算插入一條數據,也會調用MapReduce。

可以直接使用HDFS上傳文件到table1文件夾中,或者使用Hive的load命令。
這裏我們選擇Load Data的方式。

提前準備好一個txt文件,文件內容如下:

1,xiaoming,book-TV-code,beijing:chaoyang-shagnhai:pudong
2,lilei,book-code,nanjing:jiangning-taiwan:taibei
3,lihua,music-book,heilongjiang:haerbin

這裏穿插分享xshell如何上傳文件到Linux服務器的方法
接下來導入數據:

 LOAD Data local inpath '/home/hadoop/t1.txt' into TABLE table1;

下面顯示導入成功
在這裏插入圖片描述

查看錶的內容

select * from table1;

在這裏插入圖片描述
使用HDFS路徑方式查看文件內容:

hadoop fs -cat /user/hive/warehouse/table1/t1.txt

在這裏插入圖片描述

2、創建外部表table2

create external table table2(
    id      int
   ,name    string
   ,hobby   array<string>
   ,add     map<String,string>
)
row format delimited
fields terminated by ','
collection items terminated by '-'
map keys terminated by ':'
location '/user/table2'
;

在這裏插入圖片描述

裝載數據table2並查看文件內容:

LOAD Data local inpath '/home/hadoop/t1.txt' into TABLE table2;
select * from table2;

在這裏插入圖片描述

查看文件位置:

如下圖,我們在http://192.168.5.100:50070/explorer.html#/user/目錄下可以看到table2文件,也就是我們指定的文件路徑(在建表時指定的location)。
在這裏插入圖片描述
現在我們查看下table1文件的位置在哪裏?
table1在我們默認的路徑下
在這裏插入圖片描述
我們也可以通過命令行獲得兩者的位置信息:

desc formatted tablename;

在這裏插入圖片描述
在這裏插入圖片描述

3、分別刪除內部表和外部表

在這裏插入圖片描述
現在已經刪除掉了,現在我們查看下HDFS的文件:
發現table1已經不存在了
在這裏插入圖片描述
但是table2仍然存在
在這裏插入圖片描述
所以當我們刪除外部表table2時,其實只是刪除了table2 的元數據。
現在我們重新創建table2
在這裏插入圖片描述
不往裏面插數據,我們查看下數據:
在這裏插入圖片描述
可以看到數據依然存在。

4、修改表

一般我們不會去修改表,直接重新映射一個新表即可。
修改表名

ALTER TABLE tablename RENAME TO new_tablename;

向表中添加列

ALTER TABLE tablename ADD COLUMNS (
app_name STRING COMMENT ' Application name ' ,
session_id LONG COMMENT ' The current session id');

修改列名

ALTER TABLE table_name change column_name new_column_name
new_type;

5、刪除表

drop table if exists table_name;

6、清空表

truncate table tablename;
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章