1. 內部表
create table test (name string , age string) location '/input/table_data';
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上的數據時會轉移數據!
2、在刪除內部表的時候,Hive將會把屬於表的元數據和數據全部刪掉;而刪除外部表的時候,Hive僅僅刪除外部表的元數據,數據是不會刪除的!
3. 在創建內部表或外部表時加上location 的效果是一樣的,只不過表目錄的位置不同而已,加上partition用法也一樣,只不過表目錄下會有分區目錄而已,load data local inpath直接把本地文件系統的數據上傳到hdfs上,有location上傳到location指定的位置上,沒有的話上傳到hive默認配置的數據倉庫中。
外部表相對來說更加安全些,數據組織也更加靈活,方便共享源數據。
那么,應該如何選擇使用哪種表呢?在大多數情況沒有太多的區別,因此選擇只是個人喜好的問題。但是作為一個經驗,如果所有處理都需要由Hive完成,那么你應該創建表,否則使用外部表!