[Hive] 內部與外部表 Internal/External Table

Hive 有分所謂內部表與外部表,今天就要來討論究竟這兩個表有什麼差別?又應該在哪一個情況下使用?

內部表 Internal Table

首先先創造一個內部表,可以利用 CREATE 指令,在新增內容的部分可以使用 LOAD DATA 的方式創造,在執行過後 LOAD DATA 之後,檔案 hdfs://user/admin/data.txt 就會被自動移動到預設的hive 位置 hdfs://user/hive/warehouse/internal_table,否則也可以修改${HIVE_HOME}/conf/hive-site.xml 中的 hive.metastore.warehouse.dir 屬性。

CREATE TABLE internal_table (
id INTERGER, 
name STRING
) ROW FORMAT DELIMITED FIELDS TERMINATED BY ',';

LOAD DATA INPATH '/user/admin/data.txt' INTO table internal_table;

 

外部表 (External Table)

外部表不同於內部表,表格在一開始宣告的時候就必須要利用 LOCATION 指令指定清楚存放的位置,例如此處是放在 hdfs://user/admin/external_table 的資料夾當中。

CREATE EXTERNAL TABLE external_table (
id INTEGER, 
name STRING
) ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' 
LOCATION '/user/admin/external_table';

LOAD DATA INPATH '/user/admin/data.txt' INTO TABLE external_table;

內外部表的差別

內外部表最大的差別在於對 data 的掌控,內部表在執行 DROP 指令的時候會一併將 data 與 metadata 刪除,但是外部表再刪除表格的時候只會刪除 metadata,這邊所謂的 metadata 主要指的是 Hive Table 針對表格儲存位置或者 partition 的紀錄。

刪除表格

內部與外部表在刪除表格的時候都是使用一樣的指令,差別是內部表會刪除 HDFS 中儲存的 data,外部表則會保留。

DROP TABLE internal_table;
DROP TABLE external_table;