hive内部表与外部表
hive的内部表与外部表之间的区别
区别 | 创建表过程 | 删除表过程 |
---|---|---|
内部表 | 会将数据移动到数据仓库指向的路径 | 元数据和实际数据一起删除 |
外部表 | 仅记录数据所在的路径,不会对数据的位置坐任何改变 | 只删除元数据,不删除实际数据,相对比较安全。 |
传统数据库和hive之间的区别
传统数据库对表的验证是schema on write(写时模式),而hive在load时是不检查数据是否是符合schema的,hive遵循的是schema on read(读时模式),只有在读的时候才检查、解析具体的数据字段、schema。
内部表概念
在hive中默认情况创建一个表的语句是:
hive>create table inner_table(name string) row format delimited
hive>fields terminated by '\t'
hive>lines terminated by '\n'
hive>stored as textfile;
这样创建的表是一种内部表,hdfs上会创建相应的文件夹,如果在其中上传数据的话,数据就会保存在对应的文件夹下,当删除这个表时,在此文件夹下的所有数据也会删除,内部表的特点之一就是删除表的时候会把对应的文件也一并删除。
大数据场景下,hive处理的数据往往是非常巨大的,特点是一次上传,多次使用,往往是多个人都会使用到,如果轻易被删除的话,是非常危险的,为了避免对数据的误删,出现了外部表。
外部表概念
在创建外部表的时候,指定external关键字,这样创建的表就是外部表。
创建方式一(不指定存放目录)
这是默认创建外部表,数据存放在默认的hdfs相应的目录下。
hive>create external table outer_talbe(name string) row format delimited
hive>fields terminated by '\t'
hive>lines terminated by '\n'
hive>stored as textfile;
创建方式二(指定存放目录)
hive>create external table outer_talbe(name string) row format hive>delimited
hive>fields terminated by '\t'
hive>lines terminated by '\n'
hive>stored as textfile
hive>location 'hdfs_folder';
演示外部表删除后,其数据是否会被删除
hive>create external table outter_table(name stirng);
hive>drop table outter_table;
hive>dfs -ls -R /;
注意
删除外部表后再次建立一个内部表,其表名与被删除的表名相同的话,它还是会被关联到hdfs上相同的路径下,这时如果再删除这个表的话,那么数据就会被删除,因为此时的表是一个内部变,数据会随着表的删除而删除。
hive如何查看是外部表还是内部表
方式一
进入hive,执行“`describe extended tablename;”’查看表的详细信息。
如果是外部表,在详细信息的最后一行,会输出tableType:EXTERNAL_TABLE。
如果是内部表,则会显示tableType:MANAGD_TABLE。
方式二
在hive中执行desc formatted tablename;
可以查看表的格式和详细的信息,这里可以得到Table Type也可以得到表的location。根据Table Type可以知道表是内部表还是外部表。
总结
在团队开发中,在hdfs上存放重要数据时不要使用内部表,都是使用外部表关联数据。
参考博文
http://blog.csdn.net/wisgood/article/details/17186139