内部表不多说,之前教程我们创建的全部都是内部表,因为我们没有加External关键字。
内部表和外部表区别:
内部表数据由Hive自身管理,外部表数据由HDFS管理;
删除内部表会直接删除元数据(metadata)及存储数据,即对应HDFS的目录也会没有;而删除外部表仅仅会删除HIVE元数据,HDFS上的文件并不会被删除;
内部表数据存储在数据仓库目录(hive.metastore.warehouse.dir(默认:/user/hive/warehouse))中,外部表数据的存储位置由自己指定(也可以不指定,那么还是放在/user/hive/warehouse中,但注意此时的目录是外部表目录,删除表不会删除此目录)。
对内部表的修改会将修改直接同步给元数据,而对外部表的表结构和分区进行修改,则需要修复(MSCK REPAIR TABLE table_name;)
外部表(External Table)
创建外部表相关目录文件到HDFS
[root@master home]# cat test.txt
1:12:qqqqq:woman:20180507
2:13:aaaaa:man:20180107
3:14:zzzzz:man:20180106
4:15:wwwww:woman:20180206
5:16:sssss:woman:20180207
[root@master home]# hadoop fs -put test.txt '/user/root'
创建外部表,指向上面我们创建的文件。
hive (default)> create external table user(id int ,age int, name string,sex string,date string)
> row format delimited fields terminated by ':'
> location '/user/root';
OK
Time taken: 0.139 seconds
hive (default)> select * from user;
OK
user.id user.age user.name user.sex user.date
1 12 qqqqq woman 20180507
2 13 aaaaa man 20180107
3 14 zzzzz man 20180106
4 15 wwwww woman 20180206
5 16 sssss woman 20180207
Time taken: 0.206 seconds, Fetched: 5 row(s)
刚创建好表,就可以查出数据来了!!
测试删除表:
hive (default)> drop table user;
查看HDFS中文件是否被删除:
外部表删除表之后文件没有被删除,可以自行测试内部表,删除表之后对应的HDFS目录肯定没了!
由此我们归纳出:
外部表指向已经在HDFS中存在的数据
它和内部表在元数据的组织上时相同的,而实际存储则有极大的差异
外部表只有一个过程,加载数据和创建表同时完成,并不会移动到数据仓库目录中,只会与外部数据创建一个链接
当删除该表时,仅删除该链接而不删除实际的数据
BDStar原创文章。发布者:Liuyanling,转载请注明出处:http://bigdata-star.com/archives/1079