赞
踩
未被external修饰的表是内部表(managed table),被external修饰的是外部表(external table)
创建stu.txt
1,zs
2,ls
3,ww
4,wmz
上传stu.txt到hdfs中 , 我的上传目录是 /user/mwf
hadoop fs -mkdir /user/mwf/
hadoop fs -put stu.txt /user/mwf
> create table stu(id int,name string) row format delimited fields terminated by ","
> load data inpath "/user/mwf/stu.txt" into table stu ;
> select * from stu ;
结果:
1 zs
2 ls
3 ww
4 wmz
接着做准备工作,创建stu.txt,上传到hdfs中
> create external table stu_external (id int,name string) row format delimited fields terminated by "," location '/external/stu';
> load data inpath "/user/mwf/stu.txt" into table stu_external ;
> select * from stu_external;
> drop table stu_external ;
> create external table stu_external (id int,name string) row format delimited fields terminated by "," location '/external/stu';
> select * from stu_external;
外部表和内部表最不同的一点在于location,外部表的location指定表文件所在的位置,如果在指定的位置下有符合表结构的数据,直接查询就可以查询出数据来;如果loaction下不存在数据,可以通过load data将数据移动到location所指定的目录,然后也可以查询出数据来
如上例,通过load data将/user/mwf/下的stu.txt移动到了/external/stu下,就可以通过select查询出数据来;我们也可以在创建表的时候,直接将location指定为/external/stu,就可以通过select查询数据出来
外部表删除表的时候,会从元数据库中删除,但是不会从hdfs中删除
如上例,删除表后,会发现数据还安静的躺在/external/stu目录下;再次执行建表语句,并指定location为/external/stu,执行查询,会发现表和数据都回来了
内部表的数据是由Hive自身管理的,外部表的数据是由HDFS管理的;删除内部表会删除元数据和存储的数据;删除外部表只删除元数据不删除存储的数据
内部表的数据在hive中删除,在HDFS中也就删除了;但是外部表的数据,在Hive中删除,HDFS中还是存在的
两者都可以在建表的时候指定location,指定数据文件的存放位置;如果不指定的话,默认都是在/user/hive/warehouse/目录下(这个目录是可以在配置文件中修改的)。
两者的load 操作都会移动数据!!!
个人理解,有不对的地方欢迎指正~~
个人微信公众号【码农峰】,每天推送最新行业资讯,每周推送原创技术文章,欢迎关注。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。