Hive高级特性-ACID特性
一、概述
1、事务(transaction)
事务是一组单元化操作,这些操作要么都执行成功,要么都不执行,是一个不可分割的工作单位。
例,在人员管理系统中,你删除一个人员,你既需要删除人员的基本资料,也要删除和该人员相关的信息,如信箱,文章等等,这样,这些数据库操作语句就构成一个事务!
2、事务的基本特性-ACID
事务(transaction)的四个基本特性通常称为ACID特性,分别为:
- 原子性(Atomicity):一个事务是一个不可再分割的工作单位,事务中的所有操作要么都发生,要么都不发生。
- 一致性(Consistency):事务开始之前和事务结束以后,数据库的完整性约束没有被破坏。
- 隔离性(Isolation):多个事务并发访问,事务之间是隔离的,一个事务不影响其它事务运行效果。事务之间的影响有:脏读、不可重复读、幻读、丢失更新。
- 持久性(Durability):在事务完成以后,该事务锁对数据库所做的更改将永久保存在数据库中。
例:
A:现有一个任务要让A账户向B账户转100元,那么我们就需要执行两句:第一个是A账户-100第二个是B账户+100。原子性就是保证这两条数据要么都成功要不都不成功,如果成功一半那么就会出现总数多出100或者少100这样就会造成顾客损失或者公司损失,所以出现不成功或者成果一半就要回滚
C:假设用户A和用户B两者的钱加起来一共是5000,那么不管A和B之间如何转账,转几次账,事务结束后两个用户的钱相加起来应该还得是5000,这就是事务的一致性。
I:一个人A在发出转账请求时,B去同时查看两个账户余额,B要不看见都是转账前的状态 都是1000块,要不看到的都是转账后的状态,一个900一个1100,而不会看到一个900一个1000或者一个1000一个1100这种中间状态。
D:在使用JDBC操作数据库时,在提交事务方法后,提示用户事务操作完成,当我们程序执行完成直到看到提示后,就可以认定事务以及正确提交,即使这时候数据库出现了问题,也必须要将我们的事务完全执行完成,否则就会造成我们看到提示事务处理完毕,但是数据库因为故障而没有执行事务的重大错误。
3、Hive ACID简介
Hive从0.13开始,就在表的分区级别提供了数据的原子性、一致性和持久性。在0.14版本之后,在实现了新的事务机制后,通过打开可用的锁定机制(ZooKeeper或内存)来提供隔离性,Hive已经开始全面支持ACID,在表数据的行级别提供INSERT、UPDATE和DELETE功能。在2.x版本之后,开始提供了MERGE功能。
当我们创建表的时候,为表添加'transactional'='true'的属性,该表将会被定义为事务表,即acid表,我们可以对acid表进行insert、update、delete、merge等数据操作,而非acid表由于不支持事务,因此仅能进行load、insert操作
4、使用限制说明
(1)ACID表仅支持ORC格式;
(2)创建ACID表必须增加表属性'transactional'='true',否则将会认为这是非ACID表;
(3)不支持BEGIN,COMMIT 和 ROLLBACK,采用auto-commit;
(4)外部表无法使用事务,因为外部表的更改超出了compactor的控制范围。;
(5)将一个表定义为ACID表,就不能将其转换回非ACID表;
(6)仅支持快照级别的隔离,不支持脏读、读已提交、可重复读、串行化;
(7)使用create table like 一个ACID表,得到的将会是非ACID表,因为新表不能复制源表的属性参数,如:transactional'='true'
(8)ACID表不支持sorted table;
(9)默认事务是关闭的,需要在当前会话中配置开启事务,非事务的会话内不能读写事务表;
(10)spark不允许操作acid表
二、基础操作
1、开启事务
Hive默认是关闭事务的,在关闭事务的会话下,是无法读写ACID表的。
客户端(beeline、jdbc连接)配置下面参数,可以使当前会话开启事务:
set hive.support.concurrency=true; set hive.txn.manager= org.apache.hadoop.hive.ql.lockmgr.DbTxnManager; |
hive.exec.dynamic.partition.mode=nonstrict
2、建表
建表时必须是设置存储类型为orc(目前acid仅支持orc格式),表格属性'transactional'为true才行
create table t2(id int,name string) stored as orc tblproperties('transactional'='true');
3、增删改
(1)增
insert into t2 values(1,"xiaoming");
insert into t2 values(2,"xiaohua"),(3, "xiaoxia");
(2)删
delete from t2 where id=1;
(3)改
update t2 set name="aaa" where id=2;
4、merge
类似mysql的insert on update
ACID方式批量更新表
语法:
MERGE INTO <target table> AS T USING <source expression/table> AS S ON <boolean expression1> WHEN MATCHED [AND <boolean expression2>] THEN UPDATE SET <set clause list> WHEN MATCHED [AND <boolean expression3>] THEN DELETE WHEN NOT MATCHED [AND <boolean expression4>] THEN INSERT VALUES<value list> |
说明:
1、hive2.2开始支持merge,只支持在acid表中进行merge
1、2或3 WHEN子句可以出现;每种类型最多1个:UPDATE / DELETE / INSERT。
未匹配时必须是最后的WHEN子句。
如果同时存在UPDATE和DELETE子句,则语句中的第一个子句必须包含[AND <布尔表达式>]。
矢量化将关闭以进行合并操作。这是自动的,不需要用户采取任何措施。非删除操作不受影响。带有删除数据的表仍可以使用矢量化查询。
例子:
(1)开启事务
参考update和delete的开启事务
(2)修改一些配置,否则可能会报错
set hive.auto.convert.join=false;
-- Hive是否启用基于输入文件大小的有关将common join转换为mapjoin的优化。
set hive.merge.cardinality.check=false;
-- 目标表中出现重复匹配时要设置该参数才行
(2)新建一张acid全量表和一张非acid增量表,从增量表中获取新数据,更新到全量表中
create table all_data_table(id int,name string,operator string) partitioned by(mydate string) stored as orc tblproperties('transactional'='true');
- 点赞
- 收藏
- 关注作者
评论(0)