HQL操作之-DML命令

作者: 奋斗的蛐蛐 | 来源:发表于2021-02-03 23:28 被阅读0次

HQL操作之-DML命令

数据操纵语言DML(Data Manipulation Language),DML主要有三种形式:插入(INSERT)、删除(DELETE)、更新(UPDATE)。

事务(transaction)是一组单元化操作,这些操作要么都执行,要么都不执行,是一个不可分割的工作单元。 事务具有的四个要素:原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)、持久性(Durability),这四个基本要素通常称为ACID特性。

  • 原子性。一个事务是一个不可再分割的工作单位,事务中的所有操作要么都发 生,要么都不发生。
  • 一致性。事务的一致性是指事务的执行不能破坏数据库数据的完整性和一致性,一个事务在执行之前和执行之后,数据库都必须处于一致性状态。
  • 隔离性。在并发环境中,并发的事务是相互隔离的,一个事务的执行不能被其 他事务干扰。即不同的事务并发操纵相同的数据时,每个事务都有各自完整的 数据空间,即一个事务内部的操作及使用的数据对其他并发事务是隔离的,并 发执行的各个事务之间不能互相干扰。
  • 持久性。事务一旦提交,它对数据库中数据的改变就应该是永久性的。

Hive事务

Hive: SQL => MR任务

Hive从0.14版本开始支持事务 和 行级更新,但缺省是不支持的,需要一些附加的配置。要想支持行级insert、update、delete,需要配置Hive支持事务。

Hive事务的限制

  • Hive提供行级别的ACID语义
  • BEGIN、COMMIT、ROLLBACK暂时不支持,所有操作自动提交
  • 目前只支持ORC文件格式
  • 默认事务是关闭的,需要设置开启
  • 使用事务特性,表必须事分桶的。
  • 是能使用内部表
  • 如果一个表用于ACID,必须在表中始终属性(transactional=true)
  • 必须使用事务管理器:org.apache.hadoop.hive.ql.lockmgr.DbTxnManager
  • 目前支持快照级别的隔离。就是当一次数据查询时,会提供一个数据一致性的快照
  • LOAD DATA语句目前在事务表中暂时不支持

HDFS不支持文件修改,当有数据追加文件,HDFS不对读数据的用户提供一致性。为了对HDFS上支持数据的更新:

  • 表和分区数据都被存在基本文件中(base files)
  • 新的记录和更新删除都存在增量文件中(delta files)
  • 一个事务操作创建一系列的增量文件
  • 在读取的时候,将基础文件和修改,删除合并,最后返回给查询

Hive事务操作示例

-- 这些参数也可以设置在hive-site.xml中
SET hive.support.concurrency = true;
-- Hive 0.x and 1.x only,当前版本已经没有了
SET hive.enforce.bucketing = true;
SET hive.exec.dynamic.partition.mode = nonstrict; 
SET hive.txn.manager = org.apache.hadoop.hive.ql.lockmgr.DbTxnManager;


-- 创建表用于更新。满足条件:内部表、ORC格式、分桶、设置表属性 
create table zxz_data(
    name string,
    nid int,
    phone string,
    ntime date)
clustered by(nid) into 5 buckets
stored as orc
tblproperties('transactional'='true');


-- 创建临时表,用于向分桶表插入数据 
create table temp1(
    name string,
    nid int,
    phone string,
    ntime date)
row format delimited
fields terminated by ",";

-- 数据
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;
-- 检查数据和文件
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"); -- 执行
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 ;
-- 分桶字段不能修改,下面的语句不能执行
-- Updating values of bucketing columns is not supported 
update zxz_data set nid = nid + 1;

小结:

Hive支持行事务,允许对数据进行修改,但是条件严格。不建议在生成环境使用。

相关文章

  • HQL操作之-DML命令

    HQL操作之-DML命令 数据操纵语言DML(Data Manipulation Language),DML主要有...

  • HQL操作之-DDL命令

    HQL操作之-DDL命令 参考:https://cwiki.apache.org/confluence/displ...

  • HQL操作之DQL命令

    HQL操作之DQL命令 基本查询 where 子句 Where 子句不能使用列的别名 备注:通常情况下NULL不参...

  • HQL操作之DQL命令

    题记 本文部分资料来源于拉钩大数据高薪训练营 select 语法: SQL语句书写注意事项: SQL语句对大小写不...

  • HQL操作之CLI命令

    题记 本文资料来自于拉钩教育大数据高薪训练营 数据库操作 Hive有一个默认的数据库default,在操作HQL时...

  • 循序渐进SQLite2

    SQLite命令 基于命令的操作性质可分为: DDL:数据定义语言 DQL:数据查询语言 DML:数据操作语言 S...

  • HQL操作之数据操作

    HQL操作之数据操作 数据导入 LOCAL :load data local :从本地加载数据,本地文件会拷贝到H...

  • 脚本命令操作、查询

    1.1.1脚本命令操作 sql语句分为两大类: 1、dml对表的数据内容进行增删改查 2、ddl除了dml之外 使...

  • 数据库(增删改查)

    MySQL 数据操作 DML DML(Data Manipulation Language 数据操纵语言) DML...

  • MySQL 基础之 数据 操作(增删改查)

    MySQL 数据操作 DML DML(Data Manipulation Language 数据操纵语言) DML...

网友评论

    本文标题:HQL操作之-DML命令

    本文链接:https://www.haomeiwen.com/subject/nmohlktx.html