由于失败,无法执行 hive 交换分区:分区已存在

Posted

技术标签:

【中文标题】由于失败,无法执行 hive 交换分区:分区已存在【英文标题】:Unable to perform hive exchange partition due to failure of: Partition already exists 【发布时间】:2019-06-29 09:28:35 【问题描述】:

在将增量数据与现有数据合并后,我正在尝试从暂存数据库中交换一个分区,如下所示:

    已创建带分区的临时表:

    CREATE TABLE stg.customers_testcontrol_staging(customer_id bigint,customer_name string, customer_number string,status string,attribute_category string,attribute1 string, attribute2 string, attribute3 string, attribute4 string, attribute5 string) PARTITIONED BY (source_name string) ROW FORMAT SERDE'org.apache.hadoop.hive.ql.io.orc.OrcSerde' STORED AS INPUTFORMAT 'org.apache.hadoop.hive.ql.io.orc.OrcInputFormat' OUTPUTFORMAT 'org.apache.hadoop.hive.ql.io.orc.OrcOutputFormat' Location('/apps/hive/warehouse/stg.db/customers_testcontrol_staging'

    与基表数据合并后插入到上表中

    INSERT OVERWRITE TABLE finstg.customers_testcontrol_staging PARTITION (source_name) SELECT t1.* FROM (SELECT * FROM base.customers where source_name='ORACLE' UNION ALL SELECT * FROM external.customers_incremental_data) t1 JOIN (SELECT customer_id,source_name, max(updated_date) max_modified FROM (SELECT * FROM base.customers where source_name='ORACLE' UNION ALL SELECT * FROM external.customers_incremental_data) t2 GROUP BY customer_id,source_name) s ON t1.customer_id=s.customer_id AND t1.source_name=s.source_name;

我正在执行连接的表的主键是:customer_id & source_name

    交换分区步骤:

    ALTER TABLE base.customers EXCHANGE PARTITION (source_name = 'ORACLE') WITH TABLE stg.customers_testcontrol_staging;

但交换分区步骤失败并出现异常:

错误:编译语句时出错:FAILED:SemanticException [错误 10118]:分区已存在 [customers(source_name=ORACLE)]

我的语法来自Hive Confluence page

在 EXCHANGE 分区语句中我有什么遗漏的吗?谁能告诉我我在这里犯了什么错误以及如何解决它?

【问题讨论】:

【参考方案1】:

要成功运行exchange partition,您的目标表base.customers 不能包含您正在交换的分区。

但是base.customers 表已经有你正在交换的partition(source_name=ORACLE)

Resolution:

删除目标表中现有的partition,然后再次运行交换分区命令。

(或)

交换目标中已不存在的分区 表。

如果您只想将数据附加到Destination 表,然后通过选择从运行插入到base.customersstg.customers_testcontrol_staging 表。

From HiveDocs: Constraints for Hive Exchange partitions:

    目标表不能包含要交换的分区。

    存在索引时操作失败。

    事务表也不允许交换分区 作为来源或目的地。或者,使用 LOAD DATA 或 INSERT 用于跨事务表移动分区的 OVERWRITE 命令。

    此命令需要源表名和目标表名 具有相同的表架构。如果架构不同,则 抛出以下异常:

    这些表具有不同的架构。他们的分区不能 交换了

【讨论】:

以上是关于由于失败,无法执行 hive 交换分区:分区已存在的主要内容,如果未能解决你的问题,请参考以下文章

Hive分区的作用

求助,分区无法交换 ORA-14097

hive表分区的修复

无法从 spark sql 插入配置单元分区表

由于 Hive 元存储中的许多分区而导致的错误

Hive分区(静态分区+动态分区)