由于以下原因而无法执行配置单元交换分区:分区已存在

时间:2019-06-29 09:28:35

标签: hive hiveql

我在将增量数据与现有分区合并后,尝试从暂存db交换分区:

  1. 创建具有分区的登台表:

    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'

  2. 与基本表数据合并后将数据插入到上表中

    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

  1. Exchange分区步骤:

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

但是交换分区步骤失败,例外:

  

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

我采用了Hive Confluence page

的语法

我想在EXCHANGE分区语句中添加任何内容吗?有人可以让我在这里做错什么,如何解决?

1 个答案:

答案 0 :(得分:1)

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

  • 但是base.customers表已经具有您要交换的分区(source_name = ORACLE)

Resolution:

  • 删除目标表中现有的partition,然后再次运行exchange partition命令。

(或)

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

  • 如果您只想将数据追加到Destination表中,请通过选择 base.customers表。

  

From HiveDocs: Constraints for Hive Exchange partitions:

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

  2.   
  3. 在存在索引的情况下该操作失败。

  4.   
  5. 事务表也不允许使用Exchange分区   作为来源或目的地。或者,使用LOAD DATA或INSERT   OVERWRITE命令可在事务表之间移动分区。

  6.   
  7. 此命令同时需要源表名和目标表名   具有相同的表架构。如果架构不同,则   引发以下异常:

  8.   
  9. 表具有不同的架构。它们的分区不能是   交换

  10.