hive bug java.sql.BatchUpdateException

事件背景:java

大數據應用跑業務時候,涉及對hive表刪除操做。刪除過程當中,會引發hive metastore報錯:java.sql.BatchUpdateException: Cannot delete or update a parent row: a foreign key constraint fails ("hivemetastore_emtig3vtq7qp1tiooo07sb70ud"."COLUMNS_V2", CONSTRAINT "COLUMNS_V2_FK1" FOREIGN KEY ("CD_ID") REFERENCES "CDS" ("CD_ID"))mysql

問題分析:sql

此爲hive 的一個bug,詳細信息如apache

https://issues.apache.org/jira/browse/HIVE-19994bash

image.png

hive的表元數據存儲在mysql中,mysql中兩表之間有外鍵約束(關於mysql外鍵約束詳見下文),致使沒法刪除。ide

mysql 外鍵約束介紹:大數據

l  RESTRICT: 拒絕刪除或者更新父表。指定RESTRICT(或者NO ACTION)和忽略ON DELETE或者ON UPDATE選項的效果是同樣的。(mysql建立表時,外鍵約束默認值)spa

l  CASCADE: 從父表中刪除或更新對應的行,同時自動的刪除或更新自表中匹配的行。ON DELETE CANSCADEON UPDATE CANSCADE都被InnoDB所支持。blog

解決方案:事件

l  官方推薦解決方案:

更改hive-metastore.jar包中的package.jdo,添加以下內容:

spacer.gif

</datastore-identity> 此行下邊添加以下內容:

 <field name="cols" table="COLUMNS_V2" >

     <collection element-type="MFieldSchema"/>

     <foreign-key name="COLUMNS_V2_FK1" delete-action="cascade"/>

     <join>

        <primary-key name="COLUMNS_PK">

          <column name="COLUMN_NAME"/>

  </field>

l  其餘可行方案:(公司採起)

mysql中刪除表COLUMNS_V2的外鍵,從新建立外鍵,並制定外鍵約束爲ON DELETE CANSCADEON UPDATE CANSCADE

ALTER TABLE COLUMNS_V2 DROP FOREIGN KEY  COLUMNS_V2_FK1ALTER TABLE COLUMNS_V2 ADD CONSTRAINT COLUMNS_V2_FK1 FOREIGN KEY (CD_ID) REFERENCES CDS(CD_ID)ON DELETE CANSCADE ON UPDATE CANSCADE;
相關文章
相關標籤/搜索