Hive托管表和外部表簡析



在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導出數據供其他程序使用。


————————————————
版權聲明:本文為CSDN博主「YQlakers」的原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/yqlakers/article/details/72967684

 


免責聲明!

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



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