cdh hive增加Update、Delete支持

一、配置hive-site.xml

CDH版本先進入Hive配置頁,選擇高級,
如果使用的Hive Cli使用hive-site.xml 的 Hive 客戶端高級配置代碼段(安全閥)
如果使用的beeline ,使用hive-site.xml 的 Hive 服務高級配置代碼段(安全閥)

點擊+號,增加如下配置項

hive.support.concurrency = true  
hive.enforce.bucketing = true  
hive.exec.dynamic.partition.mode = nonstrict  
hive.txn.manager = org.apache.hadoop.hive.ql.lockmgr.DbTxnManager  
hive.compactor.initiator.on = true  
hive.compactor.worker.threads = 1

在這裏插入圖片描述
然後點擊保存更改,重啓,分發配置就可以了。

可以使用set測試配置是否生效
在這裏插入圖片描述

二、建表

如果要支持delete和update,則必須輸出是AcidOutputFormat然後必須分桶。
而且目前只有ORCFileformat支持AcidOutputFormat,不僅如此建表時必須指定參數(‘transactional’ = true)

USE test;
DROP TABLE IF EXISTS S1_AC_ACTUAL_PAYDETAIL;
CREATE TABLE IF NOT EXISTS S1_AC_ACTUAL_PAYDETAIL
(
INPUTDATE  STRING,
SERIALNO  STRING,
PAYDATE  STRING,
ACTUALPAYDATE  STRING,
CITY  STRING,
PRODUCTID  STRING,
SUBPRODUCTTYPE  STRING,
ISP2P  STRING,
ISCANCEL  STRING,
CDATE  STRING,
PAYTYPE  STRING,
ASSETSOWNER  STRING,
ASSETSOUTDATE  STRING,
CPD  DOUBLE,
PAYPRINCIPALAMT  BIGINT,
PAYINTEAMT  BIGINT,
A2  BIGINT,
A7  BIGINT,
A9  BIGINT,
A10  BIGINT,
A11  BIGINT,
A12  BIGINT,
A17  BIGINT,
A18  BIGINT,
PAYAMT  BIGINT,
LOANNO  STRING,
CREATEDATE  STRING,
CUSTOMERID  STRING,
etl_in_dt string
)
CLUSTERED BY (SERIALNO) --根據某個字段分桶
INTO 7 BUCKETS --分爲多少個桶
ROW FORMAT DELIMITED
FIELDS TERMINATED BY ','
LINES TERMINATED BY '\n'
STORED AS ORC
LOCATION '/user/hive/test/S1_AC_ACTUAL_PAYDETAIL' 
TBLPROPERTIES('transactional'='true');--增加額描述信息,比如最後一次修改信息,最後一個修改人。

注:由於cdh自動的在元數據裏面創建了COMPACTION_QUEUE表,所以博客中說的那個問題不存在

三、操作

執行

update test.S1_AC_ACTUAL_PAYDETAIL  set city='023' where SERIALNO = '20688947002';

操作100條數據,平均每條花費2秒多,其中執行花費1秒左右。相對還是能接受的。

delete from test.S1_AC_ACTUAL_PAYDETAIL  where SERIALNO = '20688947002';

四、總結
1、Hive可以通過修改參數達到修改和刪除數據的效果,但是速度遠遠沒有傳統關係型數據庫快
2、通過ORC的每個task只輸出單個文件和自帶索引的特性,以及數據的分桶操作,可以將要修改的數據鎖定在一個很小的文件塊,因此可以做到相對便捷的文件修改操作。因此數據的分桶操作非常重要,通常一些表單信息都會根據具體的表單id進行刪除與修改,因此推薦使用表單ID作爲分桶字段。
3、頻繁的update和delete操作已經違背了hive的初衷。不到萬不得已的情況,還是使用增量添加的方式最好。
4.update只支持修改單列。不支持子查詢和關聯查詢(即不能實現使用另一張表某列更新當前表某列),分區列無法更新。存儲桶列無法更新。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章