|NO.Z.00018|——————————|BigDataEnd|——|Hadoop&Hive.V18|——|Hive.v18|Hive事务|
一、HQL操作之--DML命令
### --- HQL操作之--DML命令
~~~ 数据操纵语言DML(Data Manipulation Language),
~~~ # DML主要有三种形式:
~~~ 插入(INSERT)、删除(DELETE)、更新(UPDATE)。
~~~ 事务(transaction)是一组单元化操作,这些操作要么都执行,要么都不执行,
~~~ 是一个不可分割的工作单元。
~~~ # 事务具有的四个要素:
~~~ 原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)、持久性(Durability),
~~~ 这四个基本要素通常称为ACID特性。
~~~ # 原子性。
~~~ 一个事务是一个不可再分割的工作单位,事务中的所有操作要么都发生,要么都不发生。
~~~ # 一致性。
~~~ 事务的一致性是指事务的执行不能破坏数据库数据的完整性和一致性,
~~~ 一个事务在执行之前和执行之后,数据库都必须处于一致性状态。
~~~ # 隔离性。
~~~ 在并发环境中,并发的事务是相互隔离的,一个事务的执行不能被其他事务干扰。
~~~ 即不同的事务并发操纵相同的数据时,每个事务都有各自完整的数据空间,
~~~ 即一个事务内部的操作及使用的数据对其他并发事务是隔离的,
~~~ 并发执行的各个事务之间不能互相干扰。
~~~ # 持久性。
~~~ 事务一旦提交,它对数据库中数据的改变就应该是永久性的。
二、Hive 事务
### --- Hive事务
~~~ Hive从0.14版本开始支持事务 和 行级更新,但缺省是不支持的,需要一些附加的配置。
~~~ 要想支持行级insert、update、delete,需要配置Hive支持事务。
### --- Hive事务的限制:
~~~ Hive提供行级别的ACID语义
~~~ BEGIN、COMMIT、ROLLBACK 暂时不支持,所有操作自动提交
~~~ 目前只支持 ORC 的文件格式
~~~ 默认事务是关闭的,需要设置开启
~~~ 要是使用事务特性,表必须是分桶的
~~~ 只能使用内部表
~~~ 如果一个表用于ACID写入(INSERT、UPDATE、DELETE),
~~~ 必须在表中设置表属性 : "transactional=true"
~~~ 必须使用事务管理器 org.apache.hadoop.hive.ql.lockmgr.DbTxnManager
~~~ 目前支持快照级别的隔离。就是当一次数据查询时,会提供一个数据一致性的快照
~~~ LOAD DATA语句目前在事务表中暂时不支持
~~~ HDFS是不支持文件的修改;并且当有数据追加到文件,HDFS不对读数据的用户提供一致性的。
~~~ 为了在HDFS上支持数据的更新:
~~~ 表和分区的数据都被存在基本文件中(base files)
~~~ 新的记录和更新,删除都存在增量文件中(delta files)
~~~ 一个事务操作创建一系列的增量文件
~~~ 在读取的时候,将基础文件和修改,删除合并,最后返回给查询
三、Hive 事务操作示例
### --- Hive事务操作示例
~~~ # 这些参数也可以设置在hive-site.xml中
hive (mydb)> SET hive.support.concurrency;
hive.support.concurrency=false
hive (mydb)> SET hive.support.concurrency = true;
hive (mydb)> SET hive.support.concurrency;
hive.support.concurrency=true
~~~ # Hive 0.x and 1.x only
hive (mydb)> SET hive.enforce.bucketing = true;
hive (mydb)> SET hive.exec.dynamic.partition.mode = nonstrict;
hive (mydb)> SET hive.txn.manager = org.apache.hadoop.hive.ql.lockmgr.DbTxnManager;
~~~ # 创建表用于更新。满足条件:内部表、ORC格式、分桶、设置表属性
hive (mydb)> create table zxz_data(
name string,
nid int,
phone string,
ntime date)
clustered by(nid) into 5 buckets
stored as orc
tblproperties('transactional'='true');
~~~ # 创建临时表,用于向分桶表插入数据
hive (mydb)> create table temp1(
name string,
nid int,
phone string,
ntime date)
row format delimited
fields terminated by ",";
~~~ # 数据
[root@linux123 ~]# vim /home/hadoop/data/zxz_data.txt
name1,1,010-83596208,2020-01-01
name2,2,027-63277201,2020-01-02
name3,3,010-83596208,2020-01-03
name4,4,010-83596208,2020-01-04
name5,5,010-83596208,2020-01-05
~~~ # 向临时表加载数据;向事务表中加载数据
hive (mydb)> load data local inpath '/home/hadoop/data/zxz_data.txt' overwrite into table temp1;
hive (mydb)> insert into table zxz_data select * from temp1;
~~~ # 检查数据和文件
hive (mydb)> select * from zxz_data;
zxz_data.name zxz_data.nid zxz_data.phone zxz_data.ntime
name5 5 010-83596208 2020-01-05
name1 1 010-83596208 2020-01-01
name2 2 027-63277201 2020-01-02
name3 3 010-83596208 2020-01-03
name4 4 010-83596208 2020-01-04
hive (mydb)> dfs -ls /user/hive/warehouse/mydb.db/zxz_data/;
drwxr-xr-x - root supergroup 0 2021-08-26 14:02 /user/hive/warehouse/mydb.db/zxz_data/delta_0000001_0000001_0000
~~~ # DML 操作
hive (mydb)> delete from zxz_data where nid = 3;
hive (mydb)> dfs -ls /user/hive/warehouse/mydb.db/zxz_data ;
hive (mydb)> insert into zxz_data values ("name3", 3, "010-83596208", "20210825");
~~~ # 不支持
hive (mydb)> insert into zxz_data values ("name3", 3, "010-83596208", "2020-06-01");
~~~ # 执行
hive (mydb)> insert into zxz_data select "name3", 3, "010-83596208", current_date;
hive (mydb)> dfs -ls /user/hive/warehouse/mydb.db/zxz_data ;
drwxrwxrwx - root supergroup 0 2021-08-26 14:04 /user/hive/warehouse/mydb.db/zxz_data/.hive-staging_hive_2021-08-26_14-03-36_244_72291945875136668-1
drwxr-xr-x - root supergroup 0 2021-08-26 14:02 /user/hive/warehouse/mydb.db/zxz_data/delta_0000001_0000001_0000
drwxr-xr-x - root supergroup 0 2021-08-26 14:04 /user/hive/warehouse/mydb.db/zxz_data/delta_0000002_0000002_0000
drwxr-xr-x - root supergroup 0 2021-08-26 14:07 /user/hive/warehouse/mydb.db/zxz_data/delta_0000003_0000003_0000
drwxr-xr-x - root supergroup 0 2021-08-26 14:08 /user/hive/warehouse/mydb.db/zxz_data/delta_0000004_0000004_0000
drwxr-xr-x - root supergroup 0 2021-08-26 14:09 /user/hive/warehouse/mydb.db/zxz_data/delta_0000005_0000005_0000
hive (mydb)> insert into zxz_data values
("name6", 6, "010-83596208", "2020-06-02"),
("name7", 7, "010-83596208", "2020-06-03"),
("name8", 9, "010-83596208", "2020-06-05"),
("name9", 8, "010-83596208", "2020-06-06");
hive (mydb)> dfs -ls /user/hive/warehouse/mydb.db/zxz_data ;
hive (mydb)> update zxz_data set name=concat(name, "00") where nid>3;
hive (mydb)> dfs -ls /user/hive/warehouse/mydb.db/zxz_data ;
~~~ # 分桶字段不能修改,下面的语句不能执行
~~~ # Updating values of bucketing columns is not supported update zxz_data set nid = nid + 1;
Walter Savage Landor:strove with none,for none was worth my strife.Nature I loved and, next to Nature, Art:I warm'd both hands before the fire of life.It sinks, and I am ready to depart
——W.S.Landor
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通