Hive应用:数据外置内部表
介绍
个人认为这种表就体现了Hive的无节操无底线。会颠覆你对外部表和内部表的传统认知。
当你在创建内部表的时候,加上了location和目录,那么你的数据就存放在你指定的目录中,这个目录可以是在HDFS的任意目录,所以如果你的Hive库中存在这样的表,那么你就不能随意地删除你Hive中的任何表,因为使用show tables;命令查看Hive中的表的列表时,没有明确标识哪个表是外部表,哪个表是内部表,不小心删除之后,数据就彻底没了。
示例
先创建HDFS目录/data/person,将数据文件上传到此目录之下。数据内容如下:
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内部表:
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>
此时就创建了一个数据外置的内部表,这个表也允许先有数据,上面展示的数据,就是证明了这一点,完美展示了数据外置的内部表。
然而如果删除Hive中的这个表的话,数据也会跟着被删除。
下图是数据存放的目录:
在看一下test数据库目录:
没有person表的目录。
接下来将删除person表看看目录的变化:
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应用:设置字段自增