cdh hive增加Update、Delete支持

标签: Hive

一、配置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只支持修改单列。不支持子查询和关联查询(即不能实现使用另一张表某列更新当前表某列),分区列无法更新。存储桶列无法更新。

版权声明:本文为qq_23146763原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_23146763/article/details/105996335