别的先不说,开门见山说说内部表的特点:
Hive 创建内部表时,会将数据移动到数据仓库指向的路径;
Hive 创建外部表,仅记录数据所在的路径,不对数据的位置做任何改变;
在删除表的时候,内部表的元数据和数据会被一起删除,而外部表只删除元数据,不删除数据。这样外部表相对来说更加安全些,数据组织也更加灵活,方便共享源数据。
传统数据库对表数据验证是schema on write(写时模式),而 Hive 在load时是不检查数据是否符合schema的,hive 遵循的是schema on read(读时模式),只有在读的时候hive才检查、解析具体的数据字段、schema;所以在这样的设计下,Hive支持创建外部表也变得理所应当,我们来看下如何创建一个外部表。
CREATE EXTERNAL TABLE table_name(
id STRING,
name STRING)
ROW FORMAT DELIMITED
LOCATION '/data/my_data.txt';
关键字EXTENAL告诉Hive这个表是外部的,而后面的LOCATION...子句则用于告诉Hive数据位于哪个路径下。
然而,我们需要清楚的重要的一点是管理表和外部表之间的差异要比刚开始所看到的小得多。即使对于管理表,用户也是可以知道数据是位于哪个路径下的,因此用户也是可以使用其他工具(例如hadoop的hdfs dfs命令等)来修改甚至删除管理表所在的路径目录下的数据的。
可能从严格意义上来说,Hive是管理着这些目录和文件,但是其并非具有对它们的完全控制权限。Hive实际上对于所存储的文件的完整性以及数据内容是否和表模式相一致并没有支配能力,甚至管理表都没有给用户提供这些管理能力。
尽管如此,好的软件设计的一般原则是表达意图。如果数据会被多个工具共享,那么可以创建一个外部表,来明确对数据的所有权。
用户可以在DESCRIBE EXTENDED tablename 语句的输出中查看到表是否是管理表或外部表。在末尾的详细表信息输出中,对于管理表,用户可以看到如下信息:
... tableType:MANAGED_TABLE)
对于外部表,用户可以查看到如下信息:
... tableType:EXTERNAL_TABLE)
对于管理表,用户还可以对一张存在的表进行表结构复制(而不会复制数据):
CREATE EXTERNAL TABLE IF NOT EXISTS ods.ods_table_name
LIKE mydb.employees
LOCATION '/path/to/data';
这里,如果语句中省略掉EXTERNAL关键字而且源表是外部表的话,那么生成的新表也将是外部表。如果语句中省略掉EXTERNAL关键字而且源表是内部表的话,那么生成的新表也将是内部表。
但是,如果语句中包含有EXTERNAL关键字而且源表是内部表的话,那么生成的新表将是外部表。即使在这种场景下,LOCATION子句同样是可选的。
参考资料:
1.《Hive编程指南》
2. Hive官方wiki:
https://cwiki.apache.org/confluence/display/HIVE
本文分享自微信公众号 - 老蒙大数据(simon_bigdata)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。
来源:oschina
链接:https://my.oschina.net/u/3972754/blog/4453268