Hive 中內部表與外部表的區別與建立方法

2021-08-01 09:58:48 字數 2218 閱讀 1751

先來說下hive中內部表與外部表的區別:

1)建立表時:建立內部表時,會將資料移動到資料倉儲指向的路徑;

若建立外部表,僅記錄資料所在的路徑,

不對資料的位置做任何改變。

2)刪除表時:在刪除表的時候,內部表的元資料和資料會被一起刪除,

而外部表只刪除元資料,不刪除資料。這樣外部表相對來說更加安全些,資料組織也更加靈活,方便共享源資料。

另外需要注意的是傳統資料庫對錶資料驗證是 schema on write(寫時模式),而 hive 在load時是不檢查資料是否

符合schema的,hive 遵循的是 schema on read(讀時模式),只有在讀的時候hive才檢查、解析具體的

資料字段、schema。

讀時模式的優勢是load data 非常迅速,因為它不需要讀取資料進行解析,僅僅進行檔案的複製或者移動。

寫時模式的優勢是提公升了查詢效能,因為預先解析之後可以對列建立索引,並壓縮,但這樣也會花費要多的載入時間。

下面來看下 hive 如何建立內部表:

1createtableinner_table(userid string);//內部表

2loaddata inpath'/tmp/inner_table/20121213'intotableinner_table partition(ptdate='20121213');

這個很簡單,不多說了,下面看下外部表:

01hadoop fs -ls /tmp/outer_table/20121214

02found 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-- 建表

06createexternaltableifnotexists outer_table (userid string) partitionedby(ptdate string) row format delimited fields terminatedby'\t';

07-- 建立分割槽表,利用分割槽表的特性載入多個目錄下的檔案,並且分割槽字段可以作為where條件,更為重要的是

08-- 這種載入資料的方式是不會移動資料檔案的,這點和 load data 不同,後者會移動資料檔案至資料倉儲目錄。

09altertabletestaddpartition (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...