Hadoop 为什么需要将外部表移动到托管配置单元表?

Hadoop 为什么需要将外部表移动到托管配置单元表?,hadoop,hive,Hadoop,Hive,我是Hadoop和学习Hive的新手 Hadoop定义指南第3版第428页最后一段 我不明白下面关于蜂箱中外部表的段落 常见的模式是使用外部表访问存储在HDFS(由另一个进程创建)中的初始数据集,然后使用配置单元转换将数据移动到托管配置单元表中 有人能简单地解释一下上面这句话是怎么说的吗?书中也提到了这句话 当您的表是外部表时 you can use other technologies like PIG,Cascading or Mapreduce to process it . 您还可以

我是Hadoop和学习Hive的新手

Hadoop定义指南第3版第428页最后一段

我不明白下面关于蜂箱中外部表的段落

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


有人能简单地解释一下上面这句话是怎么说的吗?

书中也提到了这句话

当您的表是外部表时

 you can use other technologies like PIG,Cascading or Mapreduce to process it .
您还可以对该数据集使用多个模式。

如果数据是外部表,您还可以延迟创建数据。

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

通常,初始数据集中的数据不是以最佳方式构造的,不适合查询。

您可能希望修改数据(如修改某些列、添加列、进行聚合等),并以特定的方式(分区/存储桶/排序等)存储数据,以便查询能够从这些优化中受益

配置单元中外部表和托管表之间的关键区别在于,外部表中的数据不由配置单元管理。 当您创建外部表时,您为该表定义了HDFS目录,而配置单元只是在其中“查看”,可以从中获取数据,但配置单元无法删除或更改该文件夹中的数据。删除外部表时,配置单元仅从其元存储中删除元数据,HDFS中的数据保持不变

托管表基本上是HDFS中的一个目录,由配置单元创建和管理。更重要的是,删除/更改该表中的分区/原始数据/表的所有操作都必须由配置单元完成,否则配置单元元存储中的元数据可能会不正确(例如,您手动从HDFS中删除分区,但配置单元元存储包含分区存在的信息)

在Hadoop定义指南中,我认为作者的意思是,编写生成一些原始数据并将其保存在某个文件夹中的MR作业是一种常见做法。然后创建配置单元外部表,该表将查看该文件夹。然后安全地运行查询,而不存在删除表等风险。 换句话说,您可以执行生成一些通用数据的MR工作,而不是使用配置单元外部表作为插入到托管表中的数据源。它可以帮助您避免创建无聊的类似MR作业,并将此任务委托给配置单元查询—您可以创建从外部表获取数据的查询,按照您的意愿对其进行聚合/处理,并将结果放入托管表中


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

除非要启用ACID或其他,否则没有理由将表移动到托管

托管/外部表支持的功能差异列表将来可能会更改,最好使用当前文档。目前,这些功能包括:

  • 存档/取消存档/截断/合并/连接仅适用于托管 桌子
  • DROP删除托管表的数据,而只删除 外部元数据
  • ACID/Transactional仅适用于 托管表
  • 查询结果缓存仅适用于托管 桌子
  • 外部表上只允许使用依赖约束
  • 某些物化视图功能仅适用于托管表
您可以在同一位置上创建外部表和托管表,请参阅此答案,了解更多详细信息和测试:


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

明白了。。谢谢迪玛。。你太棒了:)