先來說下hive中內部表與外部表的區別:
1)建立表時:建立內部表時,會將資料移動到資料倉儲指向的路徑;
若建立外部表,僅記錄資料所在的路徑,
不對資料的位置做任何改變。
2)刪除表時:在刪除表的時候,內部表的元資料和資料會被一起刪除,
而外部表只刪除元資料,不刪除資料。這樣外部表相對來說更加安全些,資料組織也更加靈活,方便共享源資料。
另外需要注意的是傳統資料庫對錶資料驗證是 schema on write(寫時模式),而 hive 在load時是不檢查資料是否
符合schema的,hive 遵循的是 schema on read(讀時模式),只有在讀的時候hive才檢查、解析具體的
資料字段、schema。
讀時模式的優勢是load data 非常迅速,因為它不需要讀取資料進行解析,僅僅進行檔案的複製或者移動。
寫時模式的優勢是提公升了查詢效能,因為預先解析之後可以對列建立索引,並壓縮,但這樣也會花費要多的載入時間。
下面來看下 hive 如何建立內部表:
1
create
table
inner_table(userid string);//內部表
2
load
data inpath
'/tmp/inner_table/20121213'
into
table
inner_table partition(ptdate=
'20121213'
);
這個很簡單,不多說了,下面看下外部表:
01
hadoop fs -ls /tmp/outer_table/20121214
02
found 2 items
03
-rw-r
--r-- 3 june supergroup 1240 2012-12-26 17:15 /tmp/outer_table/20121214/part-00000
04
-rw-r
--r-- 1 june supergroup 1240 2012-12-26 17:58 /tmp/outer_table/20121214/part-00001
05
-- 建表
06
create
external
table
if
not
exists outer_table (userid string) partitioned
by
(ptdate string) row format delimited fields terminated
by
'\t'
;
07
-- 建立分割槽表,利用分割槽表的特性載入多個目錄下的檔案,並且分割槽字段可以作為where條件,更為重要的是
08
-- 這種載入資料的方式是不會移動資料檔案的,這點和 load data 不同,後者會移動資料檔案至資料倉儲目錄。
09
alter
table
test
add
partition (ptdate=
'20121214'
) location
'/tmp/outer_table/20121214'
;
10
-- 注意目錄20121214最後不要畫蛇添足加 /*,我就是linux shell用多了,加了這玩意,除錯了一下午。。。
注意:location後面跟的必須是目錄
最後提下還有一種方式是建表的時候就指定外部表的資料來源路徑,表中沒有分割槽列。
這樣的壞處是只能載入乙個資料來源。
hive 內部表與外部表的區別
本文以例子的形式介紹一下hive內錶和外表的區別。例子共有4個 不帶分割槽的內錶 帶分割槽的內錶 不帶分割槽的外表 帶分割槽的外表。1 不帶分割槽的內錶 建立表 create table innertable id int,name string row format delimited field...
hive外部表與內部表的區別
測試一下,放三個檔案到hdfs中 hdfs dfs mkdir input hdfs dfs put student01.txt input hdfs dfs put student02.txt input hdfs dfs put student03.txt input 現在建立乙個外部表來指向這...
hive 內部表與外部表的區別
hive 內部表 hive create table soyo55 name string,addr string,money string row format delimited fields terminated by stored as textfile hive load data loc...