Hive 开启事务ACID 运行删和改操作
2025-02-09 00:00:33  阅读数 747

                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;