概述
一、概念
Hive表分为两类,即内部表和外部表。
内部表(managed table)
所谓内部表(managed table)即Hive管理的表,Hive内部表的管理既包含逻辑以及语法上的,也包含实际物理意义上的,即创建Hive内部表时,数据将真实存在于表所在的目录内,删除内部表时,物理数据和文件也一并删除。
外部表(external table)
外部表(external table)则不然,其管理仅仅是在逻辑和语法意义上的,即新建表仅仅是指向一个外部目录而已。同样,删除时也并不物理删除外部目录,而仅仅是将引用和定义删除。
考虑下面的语句:
CREATE TABLE my_managed_table(col1 STRING)
LOAD DATA INPATH '/user/root/test_data.txt'
IN TO table my_managed_table
上述语句会将hdfs://user/root/data.txt移动到Hive的对应目录hdfs://user/hive/warehouse/managed_table。但是载入数据的速度非常快,因为Hive只是把数据移动到对应的目录,不会对数据是否符合定义的Schema做校验,这个工作通常在读取的时候进行(即为Schema On Read)。同时,my_managed_table使用DROP语句删除后,其数据和表的元数据都被删除,不再存在,这就是Hive Managed的意思:
DROP TABLE my_managed_table;
外部表则不一样,数据的创建和删除完全由自己控制,Hive不管理这些数据。数据的位置在创建时指定:
CREATE EXTERNAL TABLE externale_table(dummy STRING)
LOCATION '/user/root/externale_table'
LOAD DATA INPATH '/user/root/data.txt'
IN TO table externale_table
指定EXTERNAL关键字后,Hive不会把数据移动到warehouse目录中。事实上,Hive甚至不会校验外部表的目录是否存在。这使得我们可以在创建表之后再创建数据。当删除外部表时,Hive只删除元数据,而不会删除外部实际物理文件。
二、什么时候使用内部表,什么时候使用外部表?
大多数情况下,这两者的区别不是很明显。
如果数据的所有处理都在Hive中进行,那么更倾向于选择内部表。
如果Hive和其他工具针对相同的数据集做处理,那么外部表更合适。一种常见的模式是使用外部表访问存储的HDFS(通常由其他工具创建)中的初始数据,然后使用Hive转换数据并将其结果放在内部表中。相反,外部表也可以用于将Hive的处理结果导出供其他应用使用。使用外部表的另一种场景是针对一个数据集,关联多个Schema。
一般情况下,在企业内部都是使用外部表的。因为会有多人操作数据仓库,可能会产生数据表误删除操作,为了数据安全性,通常会使用外部表。
最后
以上就是悲凉曲奇为你收集整理的Hive内部表和外部表一、概念的全部内容,希望文章能够帮你解决Hive内部表和外部表一、概念所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复