Hive高级特性-ACID特性

举报
living 发表于 2021/01/21 22:18:33 2021/01/21
【摘要】 一、概述1、事务(transaction)事务是一组单元化操作,这些操作要么都执行成功,要么都不执行,是一个不可分割的工作单位。例,在人员管理系统中,你删除一个人员,你既需要删除人员的基本资料,也要删除和该人员相关的信息,如信箱,文章等等,这样,这些数据库操作语句就构成一个事务! 2、事务的基本特性-ACID事务(transaction)的四个基本特性通常称为ACID特性,分别为:原子性(A...

一、概述

1、事务(transaction

事务是一组单元化操作,这些操作要么都执行成功,要么都不执行,是一个不可分割的工作单位。

例,在人员管理系统中,你删除一个人员,你既需要删除人员的基本资料,也要删除和该人员相关的信息,如信箱,文章等等,这样,这些数据库操作语句就构成一个事务!

 

2、事务的基本特性-ACID

事务(transaction)的四个基本特性通常称为ACID特性,分别为:

  • 原子性(Atomicity):一个事务是一个不可再分割的工作单位,事务中的所有操作要么都发生,要么都不发生。
  • 一致性(Consistency):事务开始之前和事务结束以后,数据库的完整性约束没有被破坏。
  • 隔离性(Isolation):多个事务并发访问,事务之间是隔离的,一个事务不影响其它事务运行效果。事务之间的影响有:脏读、不可重复读、幻读、丢失更新。
  • 持久性(Durability):在事务完成以后,该事务锁对数据库所做的更改将永久保存在数据库中。

例:

A:现有一个任务要让A账户向B账户转100元,那么我们就需要执行两句:第一个是A账户-100第二个是B账户+100。原子性就是保证这两条数据要么都成功要不都不成功,如果成功一半那么就会出现总数多出100或者少100这样就会造成顾客损失或者公司损失,所以出现不成功或者成果一半就要回滚

C:假设用户A和用户B两者的钱加起来一共是5000,那么不管AB之间如何转账,转几次账,事务结束后两个用户的钱相加起来应该还得是5000,这就是事务的一致性。

I:一个人A在发出转账请求时,B去同时查看两个账户余额,B要不看见都是转账前的状态 都是1000块,要不看到的都是转账后的状态,一个900一个1100,而不会看到一个900一个1000或者一个1000一个1100这种中间状态。

D:在使用JDBC操作数据库时,在提交事务方法后,提示用户事务操作完成,当我们程序执行完成直到看到提示后,就可以认定事务以及正确提交,即使这时候数据库出现了问题,也必须要将我们的事务完全执行完成,否则就会造成我们看到提示事务处理完毕,但是数据库因为故障而没有执行事务的重大错误。

3Hive ACID简介

            Hive0.13开始,就在表的分区级别提供了数据的原子性、一致性和持久性。在0.14版本之后,在实现了新的事务机制后,通过打开可用的锁定机制(ZooKeeper或内存)来提供隔离性,Hive已经开始全面支持ACID,在表数据的行级别提供INSERTUPDATEDELETE功能。在2.x版本之后,开始提供了MERGE功能。

          当我们创建表的时候,为表添加'transactional'='true'的属性,该表将会被定义为事务表,即acid表,我们可以对acid表进行insertupdatedeletemerge等数据操作,而非acid表由于不支持事务,因此仅能进行loadinsert操作

4、使用限制说明

1ACID表仅支持ORC格式;

2)创建ACID表必须增加表属性'transactional'='true',否则将会认为这是非ACID表;

3)不支持BEGINCOMMIT ROLLBACK,采用auto-commit

4)外部表无法使用事务,因为外部表的更改超出了compactor的控制范围。;

5)将一个表定义为ACID表,就不能将其转换回非ACID表;

6)仅支持快照级别的隔离,不支持脏读、读已提交、可重复读、串行化;

7)使用create table like 一个ACID表,得到的将会是非ACID表,因为新表不能复制源表的属性参数,如:transactional'='true'

8ACID表不支持sorted table;

9)默认事务是关闭的,需要在当前会话中配置开启事务,非事务的会话内不能读写事务表;

10spark不允许操作acid

二、基础操作

1、开启事务

Hive默认是关闭事务的,在关闭事务的会话下,是无法读写ACID表的。

客户端(beelinejdbc连接)配置下面参数,可以使当前会话开启事务:

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;

 

4merge

类似mysqlinsert 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>

说明:

1hive2.2开始支持merge,只支持在acid表中进行merge

123 WHEN子句可以出现;每种类型最多1个:UPDATE / DELETE / INSERT

未匹配时必须是最后的WHEN子句。

如果同时存在UPDATEDELETE子句,则语句中的第一个子句必须包含[AND <布尔表达式>]

矢量化将关闭以进行合并操作。这是自动的,不需要用户采取任何措施。非删除操作不受影响。带有删除数据的表仍可以使用矢量化查询。

例子:

1)开启事务

参考updatedelete的开启事务

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');

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。