在hive中建立表時,預設情況下hive負責管理資料。這意味著hive把資料移入到它的「倉庫目錄」。另外一種選擇是建立乙個「外部表」(external table)。這會讓hive到倉庫目錄以外的位置去訪問資料。
這兩種表的區別表現在load和drop命令的語義上。先來看託管表(managed table)。
載入資料到託管表時,hive把資料移到倉庫目錄。例如:
create table managed_table (dummy string);
load data inpath '/usr/tom/data.txt' into table managed_table;
把檔案hdfs://usr/tom/data.txt移到hive的managed_table表的倉庫目錄中。即hdfs://user/hive/warehouse/managed_table。
由於載入操作就是檔案系統中的檔案移動和檔案重新命名,因此它的執行速度很快。但是,即使是託管表,hive也並不檢查表目錄中的檔案是否符合為表所宣告的模式。如果有資料和模式不匹配,只有在查詢時才會知道。我們通常要通過查詢為缺失字段返回的空值null才知道存在不匹配的行。可以發出乙個簡單的select語句來查詢表中的若干行資料,從而檢查資料是否能被正確解析。
如果隨後要丟棄乙個表,可以使用如下語句:
drop table managed_table;
這個表,包括它的元資料和資料,會被一起刪除。因此,因為最初的load是乙個移動操作,而drop是乙個刪除操作。所以資料會徹底消失。這就是hive所謂的「託管資料」的含義。
對於外部表而言,這兩個操作的結果就不一樣了:由你來控制資料的建立和刪除。外部資料的位置需要建立表的時候指明:
create external table external_table (dummy string) location '/usr/tom/external_table';
load data inpath '/usr/tom/data.txt' into table external_table;
使用external關鍵字以後,hive知道資料並不是自己管理,因此不會把資料移到自己的倉庫目錄。事實上,在定義時,它甚至不會檢查這一外部表位置是否存在。這是乙個非常有用的特性,因為它意味著你可以把建立資料推遲到建立表之後才進行。
丟棄外部表時,hive不會碰資料,只會刪除元資料。
那麼,應該如何選擇使用那種表呢?大都數情況下,這兩種方式沒有太大的區別(當然drop語義除外),因此這只是個人喜好問題。作為乙個經驗法則,如果所有處理都是由hive完成,應該使用託管表。普遍的用法是把存放在hdfs的初始資料集作外部表進行使用,然後用hive的變換功能把資料移到託管的hive表。這一方法反之也成立--外部表可以用於從hive匯出資料供其他程式使用。
hive外部表和內部表
1.內部表指hive建立並通過load data inpath進資料庫的表,這種表可以理解為資料和表結構都儲存在一起的資料表。當你通過drop table table name 刪除元資料中表結構的同時,表中的資料也同樣會從hdfs中被刪除。sql view plain copy create ta...
Hive內部表和外部表
總結一下hive的內部表和外部表以及兩者的區別。平時建立的普通表為內部表 create table test internal id string comment id name string comment 名字 comment 測試內部表 row format delimited fields ...
Hive 外部表和內部表
外部表說明 外部表因為是指定其他的hdfs路徑的資料載入到表當中來,所以hive表會認為自己不完全獨佔這份資料,所以刪除hive表的時候,資料仍然存放在hdfs當中,不會刪掉 管理表和外部表的使用場景 操作案例 分別建立老師與學生表外部表,並向表中載入資料 建立老師表 create external...