Hive 从 0.13 版本开始支持事务(ACID)功能,但完整的事务支持是在 Hive 3.0 及更高版本中实现的。以下是创建和使用 Hive 事务表的详细方法。
## 前提条件
在创建事务表之前,需要确保以下配置已设置:
-- 启用Hive事务支持
bashSET 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;
-- 对于Hive 3.0+还需要设置(默认已包含)
bashSET hive.compactor.initiator.on=true; SET hive.compactor.worker.threads=1;
## 创建事务表的基本语法
sql
CREATE [EXTERNAL] TABLE table_name (
column1 data_type,
column2 data_type,
...
)
[PARTITIONED BY (partition_column data_type, ...)]
CLUSTERED BY (bucket_column) INTO n BUCKETS
STORED AS ORC
TBLPROPERTIES (
'transactional'='true',
-- 可选属性
'orc.compress'='SNAPPY',
'bucket_count'='n'
);
## 完整示例
### 示例1:创建基本事务表
sql
CREATE TABLE transactional_table (
id INT,
name STRING,
value DOUBLE,
update_time TIMESTAMP
)
CLUSTERED BY (id) INTO 4 BUCKETS
STORED AS ORC
TBLPROPERTIES (
'transactional'='true',
'orc.compress'='SNAPPY'
);
### 示例2:创建分区事务表
sql
CREATE TABLE partitioned_transactional_table (
id INT,
name STRING,
amount DECIMAL(10,2),
trans_date TIMESTAMP
)
PARTITIONED BY (department STRING)
CLUSTERED BY (id) INTO 4 BUCKETS
STORED AS ORC
TBLPROPERTIES (
'transactional'='true',
'orc.compress'='ZLIB'
);
### 示例3:带有主键约束的事务表(Hive 3.0+)
sql
CREATE TABLE acid_with_pk (
id INT PRIMARY KEY,
name STRING,
salary DECIMAL(10,2)
)
CLUSTERED BY (id) INTO 2 BUCKETS
STORED AS ORC
TBLPROPERTIES (
'transactional'='true',
'transactional_properties'='default',
'orc.compress'='SNAPPY'
);
## 事务表操作示例
### 插入数据
sql
INSERT INTO TABLE transactional_table VALUES
(1, 'Item A', 100.50, CURRENT_TIMESTAMP),
(2, 'Item B', 200.75, CURRENT_TIMESTAMP);
### 更新数据
sql
UPDATE transactional_table
SET value = 150.00
WHERE id = 1;
### 删除数据
sql
DELETE FROM transactional_table
WHERE id = 2;
### 合并操作(MERGE)
sql
MERGE INTO transactional_table AS target
USING updates_source AS source
ON target.id = source.id
WHEN MATCHED AND source.op = 'update' THEN
UPDATE SET value = source.value, update_time = CURRENT_TIMESTAMP
WHEN MATCHED AND source.op = 'delete' THEN
DELETE
WHEN NOT MATCHED THEN
INSERT VALUES (source.id, source.name, source.value, CURRENT_TIMESTAMP);
## 重要注意事项
-
存储格式要求:事务表必须使用 ORC 存储格式
-
分桶要求:事务表必须分桶(CLUSTERED BY)
-
性能考虑:
-
小文件合并(compaction)会影响性能
-
适合频繁更新的场景,纯追加数据场景不需要事务表
- 版本兼容性:
-
Hive 3.0+ 提供完整的事务支持
-
早期版本(0.14-2.x)功能有限
- 元数据管理:可以使用 `SHOW TRANSACTIONS` 查看当前事务
对于大多数数据仓库场景,如果主要是批量加载和查询操作,使用普通表而非事务表通常性能更好。