由于失败,无法执行 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.customers
表
stg.customers_testcontrol_staging
表。
From HiveDocs: Constraints for Hive Exchange partitions:
目标表不能包含要交换的分区。
存在索引时操作失败。
事务表也不允许交换分区 作为来源或目的地。或者,使用 LOAD DATA 或 INSERT 用于跨事务表移动分区的 OVERWRITE 命令。
此命令需要源表名和目标表名 具有相同的表架构。如果架构不同,则 抛出以下异常:
这些表具有不同的架构。他们的分区不能 交换了
【讨论】:
以上是关于由于失败,无法执行 hive 交换分区:分区已存在的主要内容,如果未能解决你的问题,请参考以下文章