HQL操作之-DML命令
數(shù)據(jù)操縱語(yǔ)言DML(Data Manipulation Language),DML主要有三種形式:插入(INSERT)、刪除(DELETE)、更新(UPDATE)。
事務(wù)(transaction)是一組單元化操作,這些操作要么都執(zhí)行,要么都不執(zhí)行,是一個(gè)不可分割的工作單元。 事務(wù)具有的四個(gè)要素:原子性(Atomicity)、一致性(Consistency)、隔離性(Isolation)、持久性(Durability),這四個(gè)基本要素通常稱為ACID特性。
- 原子性。一個(gè)事務(wù)是一個(gè)不可再分割的工作單位,事務(wù)中的所有操作要么都發(fā) 生,要么都不發(fā)生。
- 一致性。事務(wù)的一致性是指事務(wù)的執(zhí)行不能破壞數(shù)據(jù)庫(kù)數(shù)據(jù)的完整性和一致性,一個(gè)事務(wù)在執(zhí)行之前和執(zhí)行之后,數(shù)據(jù)庫(kù)都必須處于一致性狀態(tài)。
- 隔離性。在并發(fā)環(huán)境中,并發(fā)的事務(wù)是相互隔離的,一個(gè)事務(wù)的執(zhí)行不能被其 他事務(wù)干擾。即不同的事務(wù)并發(fā)操縱相同的數(shù)據(jù)時(shí),每個(gè)事務(wù)都有各自完整的 數(shù)據(jù)空間,即一個(gè)事務(wù)內(nèi)部的操作及使用的數(shù)據(jù)對(duì)其他并發(fā)事務(wù)是隔離的,并 發(fā)執(zhí)行的各個(gè)事務(wù)之間不能互相干擾。
- 持久性。事務(wù)一旦提交,它對(duì)數(shù)據(jù)庫(kù)中數(shù)據(jù)的改變就應(yīng)該是永久性的。
Hive事務(wù)
Hive: SQL => MR任務(wù)
Hive從0.14版本開(kāi)始支持事務(wù) 和 行級(jí)更新,但缺省是不支持的,需要一些附加的配置。要想支持行級(jí)insert、update、delete,需要配置Hive支持事務(wù)。
Hive事務(wù)的限制
- Hive提供行級(jí)別的ACID語(yǔ)義
- BEGIN、COMMIT、ROLLBACK暫時(shí)不支持,所有操作自動(dòng)提交
- 目前只支持ORC文件格式
- 默認(rèn)事務(wù)是關(guān)閉的,需要設(shè)置開(kāi)啟
- 使用事務(wù)特性,表必須事分桶的。
- 是能使用內(nèi)部表
- 如果一個(gè)表用于ACID,必須在表中始終屬性(transactional=true)
- 必須使用事務(wù)管理器:org.apache.hadoop.hive.ql.lockmgr.DbTxnManager
- 目前支持快照級(jí)別的隔離。就是當(dāng)一次數(shù)據(jù)查詢時(shí),會(huì)提供一個(gè)數(shù)據(jù)一致性的快照
- LOAD DATA語(yǔ)句目前在事務(wù)表中暫時(shí)不支持
HDFS不支持文件修改,當(dāng)有數(shù)據(jù)追加文件,HDFS不對(duì)讀數(shù)據(jù)的用戶提供一致性。為了對(duì)HDFS上支持?jǐn)?shù)據(jù)的更新:
- 表和分區(qū)數(shù)據(jù)都被存在基本文件中(base files)
- 新的記錄和更新刪除都存在增量文件中(delta files)
- 一個(gè)事務(wù)操作創(chuàng)建一系列的增量文件
- 在讀取的時(shí)候,將基礎(chǔ)文件和修改,刪除合并,最后返回給查詢
Hive事務(wù)操作示例
-- 這些參數(shù)也可以設(shè)置在hive-site.xml中
SET hive.support.concurrency = true;
-- Hive 0.x and 1.x only,當(dāng)前版本已經(jīng)沒(méi)有了
SET hive.enforce.bucketing = true;
SET hive.exec.dynamic.partition.mode = nonstrict;
SET hive.txn.manager = org.apache.hadoop.hive.ql.lockmgr.DbTxnManager;
-- 創(chuàng)建表用于更新。滿足條件:內(nèi)部表、ORC格式、分桶、設(shè)置表屬性
create table zxz_data(
name string,
nid int,
phone string,
ntime date)
clustered by(nid) into 5 buckets
stored as orc
tblproperties('transactional'='true');
-- 創(chuàng)建臨時(shí)表,用于向分桶表插入數(shù)據(jù)
create table temp1(
name string,
nid int,
phone string,
ntime date)
row format delimited
fields terminated by ",";
-- 數(shù)據(jù)
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
load data local inpath '/mnt/hadoop/data/zxz_data.dat' overwrite into table temp1;
insert into table zxz_data select * from temp1;
-- 檢查數(shù)據(jù)和文件
select * from zxz_data;
dfs -ls /user/hive/warehouse/mydb.db/zxz_data/;
-- DML 操作
delete from zxz_data where nid = 3;
dfs -ls /user/hive/warehouse/mydb.db/zxz_data/;
insert into zxz_data values ("name3", 3, "010-83596208", current_date); -- 不支持
insert into zxz_data values ("name3", 3, "010-83596208", "2020- 06-01"); -- 執(zhí)行
insert into zxz_data select "name3", 3, "010-83596208", current_date;
dfs -ls /user/hive/warehouse/mydb.db/zxz_data ;
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");
dfs -ls /user/hive/warehouse/mydb.db/zxz_data ;
update zxz_data set name=concat(name, "00") where nid>3;
dfs -ls /user/hive/warehouse/mydb.db/zxz_data ;
-- 分桶字段不能修改,下面的語(yǔ)句不能執(zhí)行
-- Updating values of bucketing columns is not supported
update zxz_data set nid = nid + 1;
小結(jié):
Hive支持行事務(wù),允許對(duì)數(shù)據(jù)進(jìn)行修改,但是條件嚴(yán)格。不建議在生成環(huán)境使用。