肯定需要 Hive 中的外部 table 的任何生产场景?

Any production scenario where External table in Hive is definitely needed?

我知道当我们尝试删除 table 时,它只会删除元数据,不会删除数据。但是,内部 tables 可能没有用并且只能通过外部 tables 实现的行业中的特定生产用例是什么?

  1. 如果我们认为通过外部 table,我们可以确保数据安全且不被任何人删除,这可以在托管 table 中通过设置 no_drop 限制 table 删除的选项。

  2. 如果我们认为使用相同的底层数据,可以创建许多 tables,甚至可以通过托管 tables 轻松实现。

是否存在托管 table 可能无用而我们需要外部 table 的特定行业场景?

no_drop 仅限制删除 table,但有些情况下您可能需要 drop/create table 保留数据。

  1. 您可能需要更改 table 定义并在不删除数据的情况下重新创建它。例如,您有一些 JSON 文件由上游进程加载,上游进程向 JSON 添加了一个属性,并且您希望 re-create 您的 table 定义包含新列和拥有所有数据。或者添加更多正在从 semi-structured 文件解析的列(使用 RegexSerDe),或者只是更改 table DDL 中的正则表达式以改进提取。

  2. 场景 2:您每天将数据加载到分区文件夹中。而一些下游进程只需要最新的分区,你不能给它传递参数,而另一些进程需要整个table。在这种情况下,您可以在上游进程中的最新分区目录之上创建已分区 table 而未分区的最新分区,每次删除 re-creating 并更改位置。下游进程可以使用最新的table(事先不知道哪个是最新的分区,也不需要找到它),也可以使用整个分区。

  3. 您可能希望将数据加载到配置的托管 tables 位置根目录之外的位置,请参阅 并且您的仓库中有限制将原始数据加载到托管中的策略tables 目录。在 Cloudera 发行版上,您无法创建托管 table 并指定默认位置以外的位置。这就是为什么您可能需要 EXTERNAL table.

  4. 使用 JDBC storage handler 或 Kafka 存储处理程序的表,HBASE 只能创建为外部。

当然在某些情况下您可以使用 ALTER TABLE 而不是 DROP/CREATE 但是存储 table DDL 文件很方便,在没有 ALTER 的情况下在 repo 中版本化。

也许还有一些其他的可能use-cases。