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



我知道当我们试图删除表时,它只删除元数据,而不删除数据。但是,在内部表可能没有用处,只能通过外部表实现的行业中,具体的生产用例是什么?

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

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

是否存在任何特定的行业场景,其中托管表可能没有用处,而我们需要外部表?

no_drop只是限制删除表,但在某些情况下,您可能需要删除/创建保存数据的表。

  1. 您可能需要更改表定义并在不删除数据的情况下重新创建它。例如,上游进程加载了一些JSON文件,上游进程又为JSON添加了一个属性,并且您希望重新创建表定义,以包含新列并保留所有数据。或者添加更多从半结构化文件中解析的列(使用RegexSerDe(,或者只需更改表DDL中的regex以改进提取。

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

  3. 您可能希望将数据加载到配置的托管表位置根目录之外的位置,请参阅https://stackoverflow.com/a/67073849/2700344您的仓库中有一些策略限制将原始数据加载到托管表目录中。在Cloudera分发版上,您不能创建托管表并指定默认位置以外的位置。这就是您可能需要EXTERNAL表的原因。

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

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

也许还有其他一些可能的用例。

最新更新