Hive外部表和內部表區別以及相互轉換

2021-10-01 07:22:37 字數 2008 閱讀 2314

hive建表語句

create [external] table [if not exists] [db_name.]table_name

(col_name data_type [comment 'col_comment'], ...)

[partitioned by (col_name data_type [comment 'col_comment'], ...)]

[comment 'table_comment']

[with serdeproperties ('key1'='value1', 'key2'='value2', ...)]

[[row format row_format] [stored as file_format]

][location 'hdfs_path']

[tblproperties ('key1'='value1', 'key2'='value2', ...)]

[cached in 'pool_name' [with replication = integer] | uncached]

1234567891011

其中external關鍵字用來區分內部表和外部表,location指定也可以不指定預設為hive倉庫路徑

內部表create table tablea(id int,name string);

1內部表預設的路徑實在hive預設指定的路徑,一般是在hdfs/user/hive/warehouse/database.db/tablea/下,如果刪除表會連路徑和資料一起刪掉

外部表外部和內部的區別

a、最大的區別:外部表刪除表僅僅刪除hive中元資料不刪除資料和指定的路徑,內部表如果drop掉表,資料和預設路徑都刪除了,

b、一般建表沒有特別說一定要建內部還是外部表,看個人喜好或者公司規定,若怕資料誤刪可以建外部表為主

外部表和內部表的轉換

1、外部表和內部表其實是可以通過更改屬性來轉換的。而且不會因為資料量大就轉換效能慢,,這個時候就是路徑是在預設hive倉庫路徑下也不會影響外部表的性質,即刪除表不會刪除路徑和資料,修改表名也不會將資料夾名稱修改,轉換示例如下

內部轉外部

alter table tablea set tblproperties('external'='true')

外部轉內部

alter table tablea set tblproperties('external'='false')

1234

2、問題來了::**如果最開始建立了外部表在預設路徑下,這個時候如果對錶重名的話,相應的路徑名是不會變,這個時候如果在重建乙個表名和原表一樣名稱的表就會造成兩個表的資料路徑是一樣的,顯然這是不想要的結果,**如下圖示例

首先建立了乙個外部表table_1,但是路徑不指定即為預設,這時候是否修改table_1為table_111,同時查詢表table_111的資料的確是剛剛插入的資料,這個時候因為table_111為外表,那他的資料路徑仍然是/user/hive/warehouse/test.db/table_1

這個時候在建立乙個表table_1,因為沒有指定路徑,table_1資料路徑也是/user/hive/warehouse/test.db/table_1,而因為先後建立的兩個表結構是一樣,這個時候查詢table_1,其實也能查出1,2這個資料來(第二圖所示),這相當於table_1和table_111共用資料來源,如果我建立第二個table_1表結構不一樣第一次建的話,那查詢table_1就會查詢報查詢結構的錯

3、這種情況一般用在:要備份歷史表如fact_a為fact_a_bak,然後新建乙個一樣活著新加了字段的fact_a表,那要試的fact_are 重新命名為fact_a_bak路徑也能跟著邊為fact_a_bak的話就不戶影響新結構的fact_a了,這個時候解決方案為:需要在rename fact_a前把fact_a先改為內部表然後在重新命名即可,再新建乙個fact_a,就不會衝突了,如下圖:

4、檢視表內外表屬性可以通過執行 describe extended tablename;來檢視,其中impala和hive中都適用,如下圖,分別是impala和hive下檢視表的屬性;

Hive內部表和外部表區別

建立內部表 建立 create table art inn sentence string row format delimited fields terminated by n 匯入 建立外部表 注意 外部表是在建立的時候定義實體資料的位置的,而且位置必須為資料夾,不能為檔案。1 匯入資料時 在匯...

hive內部表和外部表的區別 內部表和外部表

內部表 create table if not exists table name刪除表時,元資料與資料都會被刪除 外部表 create external table if not exists table name location hdfs path刪除外部表只刪除metastore的元資料,不...

Hive內部表 外部表區別

hive內部表 外部表區別自不用說,可實際用的時候還是要小心。1.內部表 sql view plain copy print create table tt name string age string location input table data 此時,會在hdfs上新建乙個tt表的資料存放...