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

一、函数说明

  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())的实例解析_第1张图片

你可能感兴趣的:(零)