hive 內部表和外部表的區別和理解


1. 內部表

create table test (name string , age string) location '/input/table_data';    
注:hive默認創建的是內部表
此時,會在hdfs上新建一個test表的數據存放地
load data inpath '/input/data' into table test ;

會將hdfs上的/input/data目錄下的數據轉移到/input/table_data目錄下。刪除test表后,會將test表的數據和元數據信息全部刪除,即最后/input/table_data下無數據,當然/input/data下再上一步已經沒有了數據!

     如果創建內部表時沒有指定location,就會在/user/Hive/warehouse/下新建一個表目錄,其余情況同上。

    注:load data會轉移數據

2. 外部表

create external table etest (name string , age string);   

會在/user/hive/warehouse/新建一個表目錄et

load data inpath '/input/edata' into table etest;    

把hdfs上/input/edata/下的數據轉到/user/hive/warehouse/et下,刪除這個外部表后,/user/hive/warehouse/et下的數據不會刪除,但是/input/edata/下的數據在上一步load后已經沒有了!數據的位置發生了變化!

本質是load一個hdfs上的數據時會轉移數據!

 

 

3. 小結

 

最后歸納一下Hive中表與外部表的區別:

 

     1、在導入數據到外部表,數據並沒有移動到自己的 數據倉庫目錄下(如果指定了location的話),也就是說外部表中的數據並不是由它自己來管理的!而內部表則不一樣;
     2、在刪除內部表的時候,Hive將會把屬於表的元數據和數據全部刪掉;而刪除外部表的時候,Hive僅僅刪除外部表的元數據,數據是不會刪除的!

 

     3. 在創建內部表或外部表時加上location 的效果是一樣的,只不過表目錄的位置不同而已,加上partition用法也一樣,只不過表目錄下會有分區目錄而已,load data local inpath直接把本地文件系統的數據上傳到hdfs上,有location上傳到location指定的位置上,沒有的話上傳到hive默認配置的數據倉庫中。

外部表相對來說更加安全些,數據組織也更加靈活,方便共享源數據。 

那么,應該如何選擇使用哪種表呢?在大多數情況沒有太多的區別,因此選擇只是個人喜好的問題。但是作為一個經驗,如果所有處理都需要由Hive完成,那么你應該創建表,否則使用外部表!

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM