欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

【零】Hive中窗口函数(over())的实例解析

程序员文章站 2022-04-16 10:07:24
...

一、函数说明

  1. OVER():指定分析函数工作的数据窗口大小,这个数据窗口大小可能会随着行的变而变化。
  2. CURRENT ROW:当前行
  3. n PRECEDING:往前n行数据
  4. n FOLLOWING:往后n行数据
  5. UNBOUNDED:起点,UNBOUNDED PRECEDING 表示从前面的起点 UNBOUNDED FOLLOWING表示到后面的终点
  6. LAG(col,n,default_val):往前第n行数据
  7. LEAD(col,n, default_val):往后第n行数据
  8. NTILE(n):把有序窗口的行分发到指定数据的组中,各个组有编号,编号从1开始,对于每一行,NTILE返回此行所属的组的编号。注意:n必须为int类型。

二、案例

2.1 数据

jack,2017-01-01,10
tony,2017-01-02,15
jack,2017-02-03,23
tony,2017-01-04,29
jack,2017-01-05,46
jack,2017-04-06,42
tony,2017-01-07,50
jack,2017-01-08,55
mart,2017-04-08,62
mart,2017-04-09,68
neil,2017-05-10,12
mart,2017-04-11,75
neil,2017-06-12,80
mart,2017-04-13,94

2.2 需求

  1. 查询在2017年4月份购买过的顾客及总人数
  2. 查询顾客的购买明细及月购买总额
  3. 上述的场景, 将每个顾客的cost按照日期进行累加
  4. 查询每个顾客上次的购买时间
  5. 查询前20%时间的订单信息

2.3 创建表

create table business(
name string, 
orderdate string,
cost int
) ROW FORMAT DELIMITED FIELDS TERMINATED BY ',';
load data local inpath "/opt/module/datas/business.txt" into table business;

2.4 题目详解

  • 查询在2017年4月份购买过的顾客及总人数

select distinct name,count(*) over() zongrenshu from business where substring(orderdate,1,7) = “2017-04”;

  • 查询顾客的购买明细及购买总额

*select ,sum(cost) over(partition by substring(orderdate,1,7)), sum(cost) over(partition by substring(orderdate,1,7),name) from business;

  • 上述的场景, 将每个顾客的cost按照日期进行累加

*select ,sum(cost) over(partition by name order by orderdate rows between unbounded preceding and current row) leijia from business;

  • 查询每个顾客上次的购买时间

select name,orderdate,cost,lag(orderdate,1,(“default”)) over(partition by name order by orderdate) last_order from business;

  • 查询前20%时间的订单信息

select * from (
select name,orderdate,cost, ntile(5) over(order by orderdate) sorted from business) t
where sorted = 1;

三、补充

sum(cost) over() as sample1,--所有行相加 
sum(cost) over(partition by name) as sample2,--按name分组,组内数据相加 
sum(cost) over(partition by name order by orderdate) as sample3,--按name分组,组内数据累加 
sum(cost) over(partition by name order by orderdate rows between UNBOUNDED PRECEDING and current row ) as sample4 ,--和sample3一样,由起点到当前行的聚合 
sum(cost) over(partition by name order by orderdate rows between 1 PRECEDING and current row) as sample5, --当前行和前面一行做聚合 
sum(cost) over(partition by name order by orderdate rows between 1 PRECEDING AND 1 FOLLOWING ) as sample6,--当前行和前边一行及后面一行 
sum(cost) over(partition by name order by orderdate rows between current row and UNBOUNDED FOLLOWING ) as sample7 --当前行及后面所有行 

四、Life

《预感》
我象一面旗帜被空旷包围,
我感到阵阵来风,我必须承受。
下面的一切还没有动静:
门轻关,烟囱无声,
窗不动,尘土还很重。
我认出风暴而激动如大海。
我舒展开来又卷缩回去,
我挣脱自身,独自
置身于伟大的风暴中。

【零】Hive中窗口函数(over())的实例解析