1. 程式人生 > >內表和外表的區別

內表和外表的區別

原文轉自:http://blog.csdn.net/zhangzhebjut/article/details/39275181

1. 內部表
  1. create table zz (name string , age string) location '/input/table_data';    
注:hive預設建立的是內部表 此時,會在hdfs上新建一個zz表的資料存放地
  1. load data inpath '/input/data' into table zz;    
會將hdfs上的/input/data目錄下的資料轉移到/input/table_data目錄下。刪除zz表後,會將zz表的資料和元資料資訊全部刪除,即最後/input/table_data下無資料,當然/input/data下再上一步已經沒有了資料!

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

    注:load data會轉移資料

2. 外部表
  1. create external table et (name string , age string);    
會在/user/hive/warehouse/新建一個表目錄et
  1. load data inpath '/input/edata' into table et;    
把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預設配置的資料倉庫中。