我是靠谱客的博主 悲凉曲奇,最近开发中收集的这篇文章主要介绍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。

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

最后

以上就是悲凉曲奇为你收集整理的Hive内部表和外部表一、概念的全部内容,希望文章能够帮你解决Hive内部表和外部表一、概念所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(92)

评论列表共有 0 条评论

立即
投稿
返回
顶部