目前所創建的表都是所謂的管理表,有時也被稱爲內部表,因爲這種表,Hive會(或多或少地)控制着數據的生命週期。
當刪除一個管理表時,Hive也會刪除這個表中的數據,管理表不方便和其他工作共享數據。
內部表(internal table/managed table):
沒有external修飾,表數據保存在Hive默認的路徑下,數據完全由Hive管理,刪除表時元數據和表數據都會一起刪除。
外部表(external table):
有external修飾,表數據保存在HDFS上,該位置由用戶指定。刪除表時,只會刪除表的元數據,所以外部表不是有Hive完全管理的。
區別:
- 內部表數據由Hive自身管理,外部表數據由HDFS管理
- 內部表數據存儲的位置是hive.metastore.warehouse.dir(默認:/user/hive/warehouse)
- 外部表數據的存儲位置由自己制定(如果沒有LOCATION,Hive將在HDFS上的/user/hive/warehouse文件夾下以外部表的表名創建一個文件夾,並將屬於這個表的數據存放在這裏)
- 刪除內部表會直接刪除元數據(metadata)及存儲數據
- 刪除外部表僅僅會刪除元數據,HDFS上的文件並不會被刪除
- 對內部表的修改會將修改直接同步給元數據,而對外部表的表結構和分區進行修改,則需要修復(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;