整套大数据学习资料(视频+笔记)百度网盘无门槛下载:http://www.edu360.cn/news/content?id=3377

12.6.1 托管表和外部表

hadoop 小红牛 11℃ 0评论

在Hive中创建表时,默认情况下Hive负责管理数据。这意味着Hive把数据移入它的“仓库目录”(warehouse directory)。另一种选择是创建一个“外部表”(external table)。这会让Hive到仓库目录以外的位置访问数据。

这两种表的区别表现在LOAD和DROP命令的语义上。先来看托管表 (managed table)。

加载数据到托管表时,Hive把数据移到仓库目录。例如:

CREATE TABLE managed_table (dummy STRING);
LOAD DATA INPATH '/user/tom/data.txt' INTO table managed_table;

把文件hdfs://user/tom/data.txt移动到Hive的managed_table表的仓库目

录中,即 hdfs://user/hive/warehouse/managed_table0 。

由于加载操作就是文件系统中的文件移动或文件重命名,因此它的 执行速度很快。但记住,即使是托管表,Hive也并不检査表目录中
的文件是否符合为表所声明的模式。如果有数据和模式不匹配,只 有在査询时才会知道。我们通常要通过査询为缺失字段返回的空值
NULL才知道存在不匹配的行。可以发出一个简单的SELECT语句来 査询表中的若干行数据,从而检查数据是否能够被正确解析。

如果随后要丢弃一个表,可使用以下语句:

DROP TABLE managed_table;

这个表,包括它的元数据和数据,会被一起删除。在此我们要重复强调, 因为最初的LOAD是一个移动操作,而DROP是一个删除操作,所以数据会 彻底消失。这就是Hive所谓的托管数据”的含义。

对于外部表而言,这两个操作的结果就不一样了:由你来控制数据的创建 和删除。外部数据的位置需要在创建表的时候指明:

CREATE EXTERNAL TABLE external_table (dummy STRING)
LOCATION '/user/tom/external_table';
LOAD DATA INPATH ’/user/tom/data.txt’ INTO TABLE external_table;

使用EXTERNAL关键字以后,Hive知道数据并不由自己管理,因此不会把 数据移到自己的仓库目录。事实上,在定义时,它甚至不会检查这一外部 位置是否存在。这是一个非常有用的特性,因为这意味着你可以把创建数 据推迟到创建表之后才进行。

丢弃外部表时,Hive不会碰数据,而只会删除元数据。

那么,应该如何选择使用哪种表呢?在多数情况下,这两种方式没有太大 的区别(当然DROP语义除外),因此这只是个人喜好问题。作为一个经验法
则,如果所有处理都由Hive完成,应该使用托管表。但如果要用Hive和 其他工具来处理同一个数据集,应该使用外部表。普遍的用法是把存放在
HDFS(由其他进程创建)的初始数据集用作外部表进行使用,然后用Hive的
变换功能把数据移到托管的Hive表。这一方法反之也成立一一外部表(未必 在HDFS中)可以用于从Hive导出数据供其他应用程序使用。®

需要使用外部表的另一个原因是你想为同一个数据集关联不同的模式。

转载请注明:全栈大数据 » 12.6.1 托管表和外部表

喜欢 (0)or分享 (0)
发表我的评论
取消评论

表情

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址