內部表和外部表的區別

2022-03-24 06:22:33 字數 4550 閱讀 4067

managed and external tables(內部表和外部表)

hive上有兩種型別的表,一種是managed table(預設的),另一種是external table(加上external關鍵字)。它倆的主要區別在於:當我們drop表時,managed table會同時刪去

data(儲存在hdfs上)和meta data(儲存在mysql),而external table只會刪meta data。

#建立內部表和外部表

hive (d6_hive)> create external table emp_external(

> empno int,

> ename string,

> job string,

> mgr int,

> hiredate string,

> sal double,

> comm double,

> deptno int

> ) row format delimited fields terminated by '\t'

> location '/d6_hive/external/emp';

oktime taken: 0.04 seconds

#hdfs中檢視

hive (d6_hive)> dfs -ls /d6_hive/external/emp;

found 1 items

-rwxr-xr-x 3 hadoop supergroup 700 2019-03-21 11:08 /d6_hive/external/emp/emp.txt

#mysql中檢視

mysql>select * from ruoze_d6.tbls\g;

*************************** 1. row ***************************

tbl_id: 45

create_time: 1553138028

db_id: 11

last_access_time: 0

owner: hadoop

retention: 0

sd_id: 45

tbl_name: emp_external

tbl_type: external_table

view_expanded_text: null

view_original_text: null

#刪除外部表

hive>drop table emp_external;

oktime taken: 1.143 seconds

#再次檢視

hive (d6_hive)> dfs -ls /d6_hive/external/emp;

found 1 items

-rwxr-xr-x 3 hadoop supergroup 700 2019-03-21 11:08 /d6_hive/external/emp/emp.txt

#雖然外部表被刪除了,但是hdfs上的資料還是存在的。

mysql>select * from ruoze_d6.tbls\g;

#但是元資料資訊就沒有了

建立內部表

hive (d6_hive)> create table emp_managed(

> empno int,

> ename string,

> job string,

> mgr int,

> hiredate string,

> sal double,

> comm double,

> deptno int

> ) row format delimited fields terminated by '\t';

oktime taken: 0.075 seconds

#我們可以發現內部表和外部表的建表區別:內部表沒有external,也就是說建表預設就是內部表,再就是,見內部表沒有指定目錄,使用的是預設目錄,預設目錄是hive的$/conf/hive-site.xml配置檔案的hive.metastore.warehouse.dir屬性指向的就是hive表資料存放的路徑

我的預設路徑是這樣的

hive (d6_hive)> set hive.metastore.warehouse.dir;

hive.metastore.warehouse.dir=/user/hive/warehouse

如果我們想一下子知道,load入hive內部表的資料的最終目錄可以檢視一下這個內部表的詳細資訊。如下所示

根據這個路徑我們去hdfs裡檢視一下。

正如我們所預想的那樣,資料就是在那裡邊。

接著我們在mysql裡檢視一下元資料資訊,資料是存在的。

mysql> select * from ruoze_d6.tbls\g;

*************************** 15. row ***************************

tbl_id: 46

create_time: 1553138641

db_id: 11

last_access_time: 0

owner: hadoop

retention: 0

sd_id: 46

tbl_name: emp_managed

tbl_type: managed_table

view_expanded_text: null

view_original_text: null

#刪除內部表

hive (d6_hive)> drop table emp_managed;

oktime taken: 0.082 seconds

hive (d6_hive)>

此時我們檢視 /user/hive/warehouse/d6_hive.db/emp_managed路徑,發現emp.txt檔案沒有

也就是說hdfs上的資料被刪掉了。

hive (d6_hive)> dfs -ls /user/hive/warehouse/d6_hive.db/emp_managed;

ls: `/user/hive/warehouse/d6_hive.db/emp_managed': no such file or directory

command failed with exit code = 1

query returned non-zero code: 1, cause: null

再次去檢視mysql元資料資訊,元資料資訊也沒有了。也就是說,內部表一單被刪除,hdfs上的data和mysql裡的metedata都會被刪除。

由以上資料可以看出,內部表被drop以後,mysql和hdfs上的資料都會被清空,外部表被drop以後,mysql上的資料沒了,但是hdfs上的資料還存在。

如何檢視乙個表是內部表還是外部表,進入那個表所在的hive庫,執行desc formatted tablename(表名);

hive (d6_hive)> desc formatted emp;

得到到的資訊中有乙個table type,後邊會標明他是managed_table 還是external table

也可以在mysql中檢視

mysql> select * from tbls where tbl_name='emp'\g;

*************************** 1. row ***************************

tbl_id: 36

create_time: 1553070314

db_id: 11

last_access_time: 0

owner: hadoop

retention: 0

sd_id: 36

tbl_name: emp

tbl_type: managed_table

view_expanded_text: null

view_original_text: null

1 row in set (0.00 sec)

使用場景:

1.外部表在刪除時不會清理hdfs上的資料,所以相對較安全,同時由於其指定目錄的特性,在跨部門合作中經常用到。

所以不小心刪除外部表後,可以建立乙個新錶指定到(location 『/hive/external_table/』)這個位置,那麼資料就會恢復。

2.對於一些原始日誌檔案,同時被多個部門同時操作的時候就需要使用外部表,如果不小心將meta data刪除了,

hdfs上 的data還在可以恢復,增加了資料的安全性。

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

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

內部表和外部表區別

1.檔案在本地而不是在hdfs的時候 1.1 建表時指定location 1 建表並load資料 create external table extable28 id int,str string row format delimited fields terminated by location ...

Hive內部表和外部表區別

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