一、hive的內(nèi)部表
1器瘪,建表語句
create table students
(
id bigint,
name string,
age int,
school string,
class string
)
#指定分隔符(下面語句表示數(shù)據(jù)以逗號分隔開)
ROW FORMAT DELIMITED FIELDS TERMINATED BY ','
#手動指定該內(nèi)部表表格創(chuàng)建在HDFS下的/user/hive/warehouse目錄內(nèi)翠储,也可以不指定,默認存放/user/hive/warehouse下
LOCATION '/user/hive/warehouse';
2娱局,存儲位置
內(nèi)部表數(shù)據(jù)存儲的位置是hive在hdfs中存在默認的存儲路徑彰亥,即default數(shù)據(jù)庫(默認:/user/hive/warehouse)
3,管理主體
內(nèi)部表的數(shù)據(jù)是Hive自身管理衰齐,創(chuàng)建內(nèi)部表時任斋,會將數(shù)據(jù)移動到數(shù)據(jù)倉庫指向的路徑
4,內(nèi)部表轉(zhuǎn)換為外部表
alter table table_name set tblproperties('EXTERNAL'='TRUE');
可以通過 desc formatted 表名 來查看表的屬性
5,數(shù)據(jù)刪除問題
刪除內(nèi)部表會直接刪除元數(shù)據(jù)(metadata)及存儲數(shù)據(jù)废酷,對內(nèi)部表的修改會將修改直接同步給元數(shù)據(jù)
二瘟檩、hive的外部表
1,建表語句
# 關(guān)鍵詞external 表示創(chuàng)建的hive表為外部表
create external table students
(
id bigint,
name string,
age int,
school string,
class string
)
#指定分隔符(下面語句表示數(shù)據(jù)以逗號分隔開)
ROW FORMAT DELIMITED FIELDS TERMINATED BY ','
#手動指定該內(nèi)部表表格創(chuàng)建在HDFS下的/user/hive/warehouse_external 目錄內(nèi)
LOCATION '/user/hive/warehouse_external ';
2澈蟆,存儲位置
外部表數(shù)據(jù)存儲的位置可以自己指定墨辛,指定除/user/hive/warehouse以外的路徑。
3趴俘,管理主體
外部表數(shù)據(jù)由HDFS管理睹簇,創(chuàng)建外部表時,僅記錄數(shù)據(jù)所在的路徑寥闪,不對數(shù)據(jù)的位置做任何改變太惠。
4,外部表轉(zhuǎn)換為內(nèi)部表
alter table table_name set tblproperties('EXTERNAL'='FALSE');
可以通過 desc formatted 表名 來查看表的屬性
5疲憋,數(shù)據(jù)刪除問題
刪除外部表僅僅會刪除元數(shù)據(jù)凿渊,HDFS上的文件并不會被刪除,而對外部表的表結(jié)構(gòu)和分區(qū)進行修改缚柳,則需要修復(MSCK REPAIR TABLE table_name)
三埃脏、hive內(nèi)部表與外部表的不同使用場景
1,場景一
因為hive內(nèi)部表在刪除表是同時刪除表數(shù)據(jù)與元數(shù)據(jù)秋忙,而外部表刪除的時候彩掐,僅僅會刪除元數(shù)據(jù),HDFS上的文件并不會被刪除翰绊,所以外部表相對來說更加安全些佩谷,數(shù)據(jù)組織也更加靈活,方便共享源數(shù)據(jù)监嗜。
2谐檀,場景二
如果所有的數(shù)據(jù)都由hive處理,則創(chuàng)建內(nèi)部表裁奇;如果數(shù)據(jù)的處理由hive和其他工具一起處理桐猬,則創(chuàng)建外部表。
3刽肠,場景三
我們在管理表不方便和其他工作共享數(shù)據(jù)溃肪。可以創(chuàng)建一個外部表指向這份數(shù)據(jù)音五,而并不需要對其具有所有權(quán)惫撰。
我們在使用hive內(nèi)部表與外部表的時候,需要根據(jù)合適的業(yè)務(wù)場景去選擇哦躺涝!
我是曉之以理的喵~厨钻,歡迎大家相互交流!!夯膀!