我是 Hadoop 和学习 Hive 的新手。
在 Hadoop 权威指南第 3 版页码中。428最后一段
我不明白下面关于 HIVE 中外部表的段落。
“一种常见的模式是使用外部表访问存储在 HDFS(由另一个进程创建)中的初始数据集,然后使用 Hive 转换将数据移动到托管的 Hive 表中。”
任何人都可以简要解释一下上面的短语是什么意思吗?
我是 Hadoop 和学习 Hive 的新手。
在 Hadoop 权威指南第 3 版页码中。428最后一段
我不明白下面关于 HIVE 中外部表的段落。
“一种常见的模式是使用外部表访问存储在 HDFS(由另一个进程创建)中的初始数据集,然后使用 Hive 转换将数据移动到托管的 Hive 表中。”
任何人都可以简要解释一下上面的短语是什么意思吗?
通常初始数据集中的数据不是以查询的最佳方式构造的。
您可能想要修改数据(例如修改某些列添加列、进行聚合等)并以特定方式存储它(分区/存储桶/排序等),以便查询将从这些优化中受益。
Hive 中的外部表和托管表之间的主要区别在于,外部表中的数据不由 Hive 管理。当您创建外部表时,您为该表定义 HDFS 目录,Hive 只是在其中“查找”并可以从中获取数据,但 Hive 无法删除或更改该文件夹中的数据。当您删除外部表时,Hive 仅从其元存储中删除元数据,HDFS 中的数据保持不变。
托管表基本上是 HDFS 中的一个目录,它由 Hive 创建和管理。甚至更多 - 删除/更改该表中的分区/原始数据/表的所有操作必须由 Hive 完成,否则 Hive 元存储中的元数据可能会变得不正确(例如,您从 HDFS 手动删除分区,但 Hive 元存储包含分区存在的信息)。
在 Hadoop 权威指南中,我认为作者的意思是编写 MR-job 生成一些原始数据并将其保存在某个文件夹中是一种常见的做法。比您创建将查看该文件夹的 Hive 外部表。而不是安全地运行查询而没有删除表等的风险。换句话说 - 您可以执行生成一些通用数据的 MR 作业,而不是使用 Hive 外部表作为插入托管表的数据源。它可以帮助您避免创建无聊的类似 MR 作业并将此任务委托给 Hive 查询 - 您创建从外部表获取数据的查询,按照您的需要聚合/处理它并将结果放入托管表中。
外部表的另一个目标是用作来自远程服务器的源数据,例如 csv 格式。
除非您要启用 ACID 或仅支持托管表的其他功能,否则没有理由将表移至托管表。
托管/外部表支持的功能差异列表将来可能会发生变化,最好使用当前文档。目前这些功能是:
您可以在同一位置创建外部和管理表,请参阅此答案以及更多详细信息和测试:https ://stackoverflow.com/a/54038932/2700344
数据结构与外部/托管表类型没有任何共同之处。如果要更改结构,则不一定需要更改表管理/外部类型
书中也有提及。
当您的表是外部表时。
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.