为什么我们需要将外部表移动到托管的hive表?

时间:2013-08-19 11:29:35

标签: hadoop hive

我是Hadoop的新手并且正在学习Hive。

在Hadoop诽谤指南第3版页面没有。 428最后一段

我不明白以下有关HIVE外部表格的段落。

“一种常见的模式是使用外部表来访问存储在HDFS中的初始数据集(由另一个进程创建),然后使用Hive转换将数据移动到托管Hive表中。”

有人可以简要解释一下上面的短语吗?

4 个答案:

答案 0 :(得分:3)

通常,初始数据集中的数据不是以查询的最佳方式构建的 您可能希望修改数据(如修改某些列添加列,进行聚合等)并以特定方式(分区/存储区/已排序等)存储它,以便查询可以从这些优化中受益。

答案 1 :(得分:3)

Hive中外部表和托管表之间的主要区别在于外部表中的数据不是由Hive管理的。 创建外部表时,您可以为该表定义HDFS目录,Hive只是“查看”它并可以从中获取数据,但Hive无法删除或更改该文件夹中的数据。删除外部表时,Hive仅删除其Metastore中的元数据,HDFS中的数据保持不变。

托管表基本上是HDFS中的目录,由Hive创建和管理。更多 - 用于删除/更改该表中的分区/原始数据/表的所有操作必须由Hive完成,否则Hive Metastore中的元数据可能会变得不正确(例如,您手动从HDFS删除分区但Hive Metastore包含分区存在的信息)。 / p>

在Hadoop的定义指南中,我认为作者意味着编写MR-job是一种常见的做法,它可以生成一些原始数据并将其保存在某个文件夹中。比你创建Hive外部表,它将查看该文件夹。而且safelly运行查询没有丢桌子的风险等。 换句话说 - 您可以执行生成一些通用数据的MR作业,而不是使用Hive外部表作为插入托管表的数据源。它可以帮助您避免创建无聊的类似MR作业并将此任务委派给Hive查询 - 您创建从外部表中获取数据的查询,根据需要聚合/处理它并将结果放入托管表。

外部表的另一个目标是用作来自远程服务器的源数据,例如用csv格式。

答案 2 :(得分:1)

书中也提到了这一点。

当你的桌子是外部桌子时。

 you can use other technologies like PIG,Cascading or Mapreduce to process it .

You can also use multiple schemas for that dataset.

You can also create data lazily if it is external table.

when you decide that dataset should be used by only Hive,make it hive managed table.

答案 3 :(得分:1)

绝对没有理由将表移动到由hive管理。

外部表支持所有功能。删除/修改数据很容易:删除文件或覆盖表/分区。

数据结构与外部/托管表类型没有任何共同之处。如果要更改结构,则不一定需要更改表组织类型