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';
OK
Time 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; OK Time 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';
OK
Time taken: 0.075 seconds
#我們可以發現內部表和外部表的建表區別:內部表沒有EXTERNAL,也就是說建表默認就是內部表,再就是,見內部表沒有指定目錄,使用的是默認目錄,默認目錄是Hive的${HIVE_HOME}/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;
OK
Time 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還在可以恢復,增加了數據的安全性。