Hive内部表和外部表

一、概念

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。

一般情况下,在企业内部都是使用外部表的。因为会有多人操作数据仓库,可能会产生数据表误删除操作,为了数据安全性,通常会使用外部表。

  • 5
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值