我的認爲這種表就體現了Hive的無節操無底線。會顛覆你對外部表和內部表的傳統認知。數據庫
當你在建立內部表的時候,加上了location和目錄,那麼你的數據就存放在你指定的目錄中,這個目錄能夠是在HDFS的任意目錄,因此若是你的Hive庫中存在這樣的表,那麼你就不能隨意地刪除你Hive中的任何表,由於使用show tables;命令查看Hive中的表的列表時,沒有明確標識哪一個表是外部表,哪一個表是內部表,不當心刪除以後,數據就完全沒了。bash
先建立HDFS目錄/data/person,將數據文件上傳到此目錄之下。數據內容以下:spa
1.0|張三|20.0|男|未知|0 2.0|李四|25.0|男|河北|0 3.0|張飛|30.0|男|河北|0 4.0|關羽|35.0|男|山東|0 5.0|小喬|38.0|女|浙江|0 6.0|劉備|40.0|男|成都|0 7.0|小李|29.0|男|江南|0
建立Hive內部表:.net
hive> create table person(id string,name string,age string,gender string,address string,test int) row format delimited fields terminated by '|' location 'hdfs://192.168.75.150:9000/data/person'; OK Time taken: 0.148 seconds hive> select * from person; OK 1.0 張三 20.0 男 未知 0 2.0 李四 25.0 男 河北 0 3.0 張飛 30.0 男 河北 0 4.0 關羽 35.0 男 山東 0 5.0 小喬 38.0 女 浙江 0 6.0 劉備 40.0 男 成都 0 7.0 小李 29.0 男 江南 0 Time taken: 0.141 seconds, Fetched: 7 row(s) hive>
此時就建立了一個數據外置的內部表,這個表也容許先有數據,上面展現的數據,就是證實了這一點,完美展現了數據外置的內部表。code
然而若是刪除Hive中的這個表的話,數據也會跟着被刪除。orm
下圖是數據存放的目錄:blog
在看一下test數據庫目錄:get
沒有person表的目錄。文件上傳
接下來將刪除person表看看目錄的變化:string
hive> drop table preson; OK Time taken: 0.184 seconds hive> show tables; OK person promo tab Time taken: 0.222 seconds, Fetched: 3 row(s) hive> drop table person; OK Time taken: 0.189 seconds hive> show tables; OK promo tab Time taken: 0.076 seconds, Fetched: 2 row(s) hive>
第一遍刪除居然沒有成功,不知道鬧哪樣,第二次刪除成功,下面是目錄結構:
data目錄空了,person文件夾也不存在了。
因此綜上所述,這種內部表有普通外部表的先有數據的特性,還具備普通內部表刪除表數據也同時刪除的特性。那麼若是這個表也是內部表的話,那麼內部表和外部表的區別在哪裏?只剩下一個external關鍵字了,其餘的沒有區別了,並且Hive中表的列表中沒有明確標識表的種類,稀裏糊塗一頓刪除,有可能刪除的就是這種表!
這種表出現有兩種可能:一種是建立外部表的時候手誤忘記寫external關鍵字,另一種就是真的須要這樣一種表,可是好像在個人職業生涯中,還暫時沒有遇到這種需求,而本人只是手誤忘記寫external關鍵字,才產生的這種表,而後刪除,從新建立,發現存放數據的目錄以及數據都沒有了,才進一步作了以上的實驗來證實這個事情。
上一篇:Hive應用:外部分區表
下一篇:Hive應用:設置字段自增