HQL操作之-DML命令

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)境使用。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 1/列出mysql數(shù)據(jù)庫(kù)中的所有數(shù)據(jù)庫(kù)sqoop list-databases -connect jdbc:mys...
    時(shí)待吾閱讀 2,815評(píng)論 1 5
  • 題記 本文部分資料來(lái)源于拉鉤大數(shù)據(jù)高薪訓(xùn)練營(yíng) select 語(yǔ)法: SQL語(yǔ)句書(shū)寫(xiě)注意事項(xiàng): SQL語(yǔ)句對(duì)大小寫(xiě)不...
    一拳超疼閱讀 1,188評(píng)論 0 0
  • 一、操作數(shù)據(jù)(增、刪、改) 當(dāng)添加、更新或者刪除數(shù)據(jù)庫(kù)中的數(shù)據(jù)時(shí)需要使用 DML 語(yǔ)句。 DML 依 據(jù)的一個(gè)集合...
    開(kāi)源oo柒閱讀 256評(píng)論 0 1
  • 基礎(chǔ) 事務(wù)和ACID 何為事務(wù)?事務(wù)就是一組單元化操作,這些操作要么都執(zhí)行,要么都不執(zhí)行,是一個(gè)不可分割的工作單位...
    stephen_k閱讀 10,679評(píng)論 0 1
  • 夜鶯2517閱讀 128,087評(píng)論 1 9

友情鏈接更多精彩內(nèi)容