数据仓库工具Hive——窗口函数,DML,事务

Posted 小企鹅推雪球!

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数据仓库工具Hive——窗口函数,DML,事务相关的知识,希望对你有一定的参考价值。

文章目录

Hive——窗口函数

  1. 窗口函数又名开窗函数,属于分析函数的一种。用于解决复杂报表统计需求的功能强大的函数,很多场景都需要用到

  2. 窗口函数用于计算基于组的某种聚合值,它和聚合函数的不同之处是:对于每个组返回多行,而聚合函数对于每个组只返回一行

  3. 窗口函数指定了分析函数工作的数据窗口大小,这个数据窗口大小可能会随着行的变化而变化。

  4. over 关键字:使用窗口函数之前一般要要通过over()进行开窗,窗口函数是针对每一行数据的;如果over中没有参数,默认的是全部结果集

    -- 查询emp表工资总和
    select sum(sal) from emp;
    -- 不使用窗口函数,有语法错误
    select ename, sal, sum(sal) salsum from emp;
    
    -- 使用窗口函数,查询员工姓名、薪水、薪水总和
    select ename, sal, sum(sal) over() salsum, concat(round(sal / sum(sal) over()*100, 1) || '%') ratiosal
    from emp;
    
  5. partition by子句 :在over窗口中进行分区,对某一列进行分区统计,窗口的大小就是分区的大小

    -- 查询员工姓名、薪水、部门薪水总和
    select ename, sal, sum(sal) over(partition by deptno) salsum
    from emp;
    
  6. order by 子句:order by 子句对输入的数据进行排序

    -- 增加了order by子句;sum:从分组的第一行到当前行求和
    select ename, sal, deptno, sum(sal) over(partition by deptno order by sal) salsum
    from emp;
    
  7. Window子句:如果要对窗口的结果做更细粒度的划分,使用window子句,有如下的几个选项:

    1. unbounded preceding。组内第一行数据
    2. n preceding。组内当前行的前n行数据
    3. current row。当前行数据
    4. n following。组内当前行的后n行数据
    5. unbounded following。组内最后一行数据
    -- rows between ... and ... 子句
    -- 等价。组内,第一行到当前行的和
    select ename, sal, deptno,
    sum(sal) over(partition by deptno order by ename) 
    from emp;
    
    select ename, sal, deptno,sum(sal) over(
    partition by deptno order by ename rows 
    between unbounded preceding and current row
    )
    from emp;
    
    -- 组内,第一行到最后一行的和
    select ename, sal, deptno,sum(sal) over(
    partition by deptno order by ename rows 
    between unbounded preceding and unbounded following
    )
    from emp;
    
    -- 组内,前一行、当前行、后一行的和
    select ename, sal, deptno,sum(sal) over(
    partition by deptno order by ename rows 
    between 1 preceding and 1 following
    )
    from emp;
    
  8. 排名函数:都是从1开始,生成数据项在分组中的排名。

    1. row_number()。排名顺序增加不会重复;如1、2、3、4、… …
    2. RANK()。 排名相等会在名次中留下空位;如1、2、2、4、5、… …
    3. DENSE_RANK()。 排名相等会在名次中不会留下空位 ;如1、2、2、3、4、… …
    -- 创建表加载数据
    create table t2(
    cname string,
    sname string,
    score int
    ) row format delimited fields terminated by '\\t';
    load data local inpath '/home/hadoop/data/t2.dat' into table t2;
    
    -- 按照班级,使用3种方式对成绩进行排名
    select cname, sname, score,
    row_number() over (partition by cname order by score desc) rank1,
    rank() over (partition by cname order by score desc) rank2,
    dense_rank() over (partition by cname order by score desc) rank3
    from t2;
    
    -- 求每个班级前3名的学员--3名的定义是什么--假设使用dense_rank
    select cname, sname, score, rank
    from (select cname, sname, score,dense_rank() over (partition by cname order by score desc) rank from t2) tmp
    where rank <= 3;
    
  9. 序列函数:

    1. lag。返回当前数据行的上一行数据
    2. lead。返回当前数据行的下一行数据
    3. first_value。取分组内排序后,截止到当前行,第一个值
    4. last_value。分组内排序后,截止到当前行,最后一个值
    5. ntile。将分组的数据按照顺序切分成n片,返回当前切片值
    -- lag。返回当前数据行的上一行数据
    -- lead。功能上与lag类似
    select cid, ctime, pv,
    lag(pv) over(partition by cid order by ctime) lagpv,
    lead(pv) over(partition by cid order by ctime) leadpv
    from userpv;
    
    -- first_value / last_value
    select cid, ctime, pv,
    first_value(pv) over (partition by cid order by ctime rows between unbounded preceding and unbounded following) as firstpv,
    last_value(pv) over (partition by cid order by ctime rows between unbounded preceding and unbounded following) as lastpv
    from userpv;
    

DML命令

  1. 数据操纵语言DML(Data Manipulation Language),DML主要有三种形式:插入(INSERT)、删除(DELETE)、更新(UPDATE)。
  2. 事务(transaction)是一组单元化操作,这些操作要么都执行,要么都不执行事务是一个不可分割的工作单元。
  3. 事务具有的四个要素:原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)、持久性(Durability),这四个基本要素通常称为ACID特性。
    1. 原子性。一个事务是一个不可再分割的工作单位,事务中的所有操作要么都发生,要么都不发生。
    2. 一致性。事务的一致性是指事务的执行不能破坏数据库数据的完整性和一致性,一个事务在执行之前和执行之后,数据库都必须处于一致性状态。
    3. 隔离性:在并发环境中,并发的事务是相互隔离的,一个事务的执行不能被其他事务干扰。即不同的事务并发操纵相同的数据时,每个事务都有各自完整的数据空间,即一个事务内部的操作及使用的数据对其他并发事务是隔离的,并发执行的各个事务之间不能互相干扰。
    4. 持久性:事务一旦提交,它对数据库中数据的改变就应该是永久性的。

Hive 事务

  1. Hive从0.14版本开始支持事务 和 行级更新,但默认是不支持的,需要一些附加的配置。
  2. 要想支持行级insert、update、delete,需要配置Hive支持事务。
  3. Hive事务的限制:
    1. Hive提供行级别的ACID语义
    2. BEGIN、COMMIT、ROLLBACK 暂时不支持,所有操作自动提交
    3. 目前只支持 ORC 的文件格式
    4. 默认事务是关闭的,需要设置开启
    5. 要是使用事务特性,表必须是分桶的
    6. 只能使用内部表
    7. 如果一个表用于ACID写入(INSERT、UPDATE、DELETE),必须在表中设置表属性 : “transactional=true”
    8. 必须使用事务管理器org.apache.hadoop.hive.ql.lockmgr.DbTxnManager
    9. 目前支持快照级别的隔离。就是当一次数据查询时,会提供一个数据一致性的快照
    10. LOAD DATA语句目前在事务表中暂时不支持
  4. HDFS是不支持文件的修改;并且当有数据追加到文件,HDFS不对读数据的用户提供一致性的。为了在HDFS上支持数据的更新:
    1. 表和分区的数据都被存在基本文件中(base files)
    2. 新的记录和更新,删除都存在增量文件中(delta files)
    3. 一个事务操作创建一系列的增量文件
    4. 在读取的时候,将基础文件和修改,删除合并,最后返回给查询

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

-- 向临时表加载数据;向事务表中加载数据
load data local inpath '/home/hadoop/data/zxz_data.txt' 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——窗口函数,DML,事务的主要内容,如果未能解决你的问题,请参考以下文章

数据仓库工具Hive——系统内置函数

Hive

hive窗口函数应用

Hive_初步见解,安装部署与测试

Hive基础

Hadoop之Hive查询语句