Hive的行级acid事务处理

本文介绍了Hive从0.13.0版本开始支持的行级ACID事务处理,包括设置相关属性、显式事务命令、操作语法等。创建支持事务的桶表并使用ORC文件格式是关键,同时展示了INSERT、UPDATE和DELETE操作的示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

//事务,hive 0.13.0之后完全支持行级acid事务处理。
//所有事务都是自动提交,并且存储文件只能是orc文件,而且只能在桶表中使用。
1.设置相关属性
SET hive.support.concurrency = true;
SET hive.enforce.bucketing = true;
SET hive.exec.dynamic.partition.mode = nonstrict;
SET hive.txn.manager = org.apache.hadoop.hive.ql.lockmgr.DbTxnManager;
SET hive.compactor.initiator.on = true;
SET hive.compactor.worker.threads = 1;

2.显式事务命令:
SHOW TRANSACTIONS;

3.操作语法
INSERT INTO TABLE tablename [PARTITION (partcol1[=val1], partcol2[=val2]...)] VALUES values_row [, values_row …];
UPDATE tablename SET column = value [, column = value…] [WHERE expression]
DELETE FROM tablename [WHERE expression]

4.创建表时,使用桶表,orc文件格式,支持事务的属性
create table tx(id int ,name string , age int)
clustered by (id) into 2 buckets
stored as orc
TBLPROPERTIES('transactional'='true');

5.执行操作
insert into
### Hive事务表与非事务表的区别 Hive中的事务表和非事务表在设计目标、功能特性以及适用场景等方面存在显著差异。以下是两者的主要区别: #### 1. 数据一致性支持 - **事务表**:支持ACID(原子性、一致性、隔离性、持久性)特性,能够实现更新、删除等操作[^2]。这种特性使得事务表非常适合需要频繁修改数据的应用场景。 - **非事务表**:不支持ACID特性,无法执更新或删除操作。通常用于只读或批量加载的数据处理。 #### 2. 文件格式限制 - **事务表**:仅支持ORC文件格式(`STORED AS ORC`),这是由于ORC格式具备高效压缩和列存的优势,适合事务操作[^2]。 - **非事务表**:可以使用多种文件格式,如TextFile、Parquet、Avro等,灵活性更高。 #### 3. 表结构要求 - **事务表**:必须是分桶表(Bucketed Table),并且需要显式设置表属性 `TBLPROPERTIES ('transactional'='true')` 才能启用事务功能[^3]。 - **非事务表**:无需特殊结构约束,可以根据业务需求自由定义。 #### 4. 配置需求 - **事务表**:默认情况下,Hive的事务功能处于关闭状态,需手动调整相关配置参数来开启事务支持[^2]。例如: ```properties set hive.support.concurrency=true; set hive.enforce.bucketing=true; set hive.exec.dynamic.partition.mode=nonstrict; ``` - **非事务表**:不需要额外配置即可正常使用。 #### 5. 性能表现 - **事务表**:由于引入了复杂的日志机制(如Delta文件和Delete_Delta文件)以记录每次变更的历史信息,因此可能会带来一定的存储开销和查询延迟[^3]。 - **非事务表**:没有这些附加成本,在大规模数据分析任务中往往表现出更优的性能。 #### 6. 使用场景 - **事务表**:当应用程序涉及实时流式数据摄入或者需要定期对现有记录进修正时,可以选择事务表。它特别适用于金融交易系统、广告点击统计等领域,其中精确度至关重要[^1]。 - **非事务表**:大多数ETL流程倾向于采用非事务表形式完成一次性导入工作负载。比如日志分析、用户为挖掘等离线计算场合更适合运用此类表格[^4]。 ```sql -- 创建一个简单的事务表示例 CREATE TABLE acid_table ( id INT, name STRING, value DOUBLE ) CLUSTERED BY (id) INTO 8 BUCKETS -- 必须声明为分桶表 STORED AS ORC TBLPROPERTIES('transactional'='true'); ``` --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值