Hive 开启事务ACID 运行删和改操作
事务表的适用场景
对于数仓中的行级数据更新删除需求比较频繁的,可以考虑使用事务表。
但平常的hive表并不建议使用事务表。因为事务表的限制很多,加上由于hive表的特性,也很难满足高并发的场景。另外,如果事务表太多,并且存在大量的更新操作,metastore后台启动的合并线程会定期的提交MapReduce Job,也会一定程度上增重集群的负担。
结论: 除非有非常迫切的行级更新需求,又只能用hive表来做,才需要去考虑事务表。
注意事项
不支持 BEGIN、COMMIT、ROLLBACK 等语句,所有的语句都是自动提交
仅支持ORC格式
设置开启事务
1、配置Hive支持事务(Hive 2.0版)
<property>
<name>hive.support.concurrency</name>
<value>true</value>
</property>
<property>
<name>hive.exec.dynamic.partition.mode</name>
<value>nonstrict</value>
</property>
<property>
<name>hive.txn.manager</name>
<value>org.apache.hadoop.hive.ql.lockmgr.DbTxnManager</value>
</property>
<property>
<name>hive.compactor.initiator.on</name>
<value>true</value>
</property>
<property>
<name>hive.compactor.worker.threads</name>
<value>1</value>
</property>
<property>
<name>hive.enforce.bucketing</name>
<value>true</value>
</property>
2、测试
--事务表 能更新的 必须是分桶的(可以分区) 存储为orc 的表并在属性中运行事务才可以
-- 分区分桶表
CREATE TABLE t2 (id INT, name STRING) PARTITIONED BY (country STRING, state STRING)
CLUSTERED BY (id) INTO 8 BUCKETS
STORED AS ORC TBLPROPERTIES ('transactional'='true');
insert into t2 partition(country='cn',state='sd') values(1,'ceshi');
update t2
set name='good'
where id=1;
delete from t2 where id =1;