设置事务表属性会导致外部表

Posted

技术标签:

【中文标题】设置事务表属性会导致外部表【英文标题】:Setting transactional-table properties results in external table 【发布时间】:2021-03-01 18:35:44 【问题描述】:

我正在通过Impala 创建一个托管表,如下所示:

CREATE TABLE IF NOT EXISTS table_name
    STORED AS parquet
    TBLPROPERTIES ('transactional'='false', 'insert_only'='false')
    AS ...

这将导致 managed table 不支持 HIVE-ACID。 但是,当我运行命令时,我仍然会得到一个外部表。 这是为什么呢?

【问题讨论】:

【参考方案1】:

我在Cloudera documentation 中发现,在创建表时忽略EXTERNAL-关键字并不意味着该表将被明确管理:

在CREATE TABLE语句中使用EXTERNAL关键字时,HMS将表存储为外部表。当您省略 EXTERNAL 关键字并创建托管表或提取托管表时,HMS 可能会将表转换为外部表或创建表可能会失败,具体取决于表属性。

因此,设置transactional=falseinsert_only=falseHive Metastore的解释中导致External Table

有趣的是,只有设置 TBLPROPERTIES ('transactional'='false') 会被完全忽略,并且仍会导致托管表具有 transactional=true)。

【讨论】:

以上是关于设置事务表属性会导致外部表的主要内容,如果未能解决你的问题,请参考以下文章

如何更改 Redshift Spectrum 中的外部表?

Hive 托管与外部表的可维护性

CSS---基础外部样式表

oracle11g,18存储结构:暂时表,手工条带化,表/索引迁移表空间,删除表,外部表

Hive 3.x 导致外部表中压缩 (bz2) json 的错误

泛微OA外部流程触发设置