hive的內部表跟外部表
先建立一個內部表:
建表語句-進入hive命令列輸入:
create table t1(
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 ':'
;
查看錶結構:
desc t1;
可以使用hiveserver2進行格式化的查詢:
往表中插入資料。
我們先看一下hdfs檔案系統,裡面在 /user/hive/warehouse/test01.db/t1
這個目錄裡面什麼都沒有。
我們使用hadoop上傳一個符合格式的檔案到這個目錄。
插入t1表中的資料:
1,xiaoming,book-TV-code,beijing:chaoyang-shagnhai:pudong
2,lilei,book-code,nanjing:jiangning-taiwan:taibei
3,lihua,music-book,heilongjiang:haerbin
hadoop fs -put t1.txt /user/hive/warehouse/test01.db/t1
這個t1.txtx檔案上傳成功。
只要上傳了,這些資料就會插入到t1表中。
建立一個外部表:
create external table t2( 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/hive/warehouse/' ;
看我寫的這個路徑 loaction ‘/user/hive/warehouse/’
在這個路徑下面本來是有test01.db這個資料夾的,在test01.db裡面有我之前上上傳的t1.txt。
然後上傳資料:
load data local inpath '/home/hadoop/apps/hiveData' overwrite into table t2;
然後查詢t2表就會發現會有資料:
但是奇怪的是:
/user/hive/warehouse 目錄下面只有t1.txt,其他的什麼都沒了,之前的test01.db檔案也沒了。
再次查詢t1表,發現裡面真的沒資料了,但是表還在。太奇怪了。
【個人對上面出現的問題的理解:】
首先我發現了這麼一個現象:
我如果建立了一個數據庫,假設我建立了test03這個資料庫:
那麼在hdfs檔案系統裡的 /user/hive/warehouse
這個目錄下面會出現這個檔案:
test03.db
如果我現在建立一個外部表t2:
create external table t2(
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/d3t2'
/user/d3t2 這個目錄一開始是沒有的,一旦我將t2這個外部表建立成功,那麼這個 /user/d3t2 目錄也會被建立。
這個是hive自動呼叫hadoop程式建立的,一開始裡面什麼都沒有。
然後我們往這個 /user/d3t2裡面載入資料。
load data local inpath '/home/hadoop/apps/hiveData/t2.txt' overwrite into table t2;
表裡面的資料就生成了。
t2.txt 檔案也會載入建表時設定的
如果此時我建一個內部表,
create table t1(
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 ':'
;
此時在hdfs檔案系統中的目錄下面 /user/hive/warehouse/test03.db
會有一個t1資料夾。
剛開始這個t1資料夾裡面,當我們使用hadoop fs -put 將符合t1表格式的檔案上傳到這個資料夾裡面,那麼這個檔案裡面的資料都插入到t1表中。
hadoop fs -put t1.txt /user/hive/warehouse/test03.db/t1
t1表的資料已經被插入:
一旦我把這個表drop掉,hdfs檔案系統裡面的t1.txt也會消失。
hadoop fs -rm -r /user/hive/warehouse/test03.db/t1/t1.txt
表裡面的資料就被刪除了:
當把外部表的外部資料檔案也刪除,那麼外部表裡面的資料也會清空。
一旦使用 drop table t1
把內部表刪除了,那麼這張表會被刪除,對應的表插入的資料檔案也會被刪除。資料是沒法被恢復的。
但是對於外部表而言,即使是使用 drop table t2 將外部表刪除,但是隻要表裡面的資料檔案 t1.txt檔案沒刪除的話,重新使t2的建表語句,執行一下,這張表裡面的資料就會被恢復。
有關內部表與外部表的區別可以參考下面這篇部落格: