本文部分参考自:https://blog.csdn.net/qq_23897391/article/details/100558433
自己的话:千里之行,始于足下。
每天都要保持前进,我势必要有强劲的实力,再跟明天的自己问好。
这类函数叫法很多,包括分析函数、窗口函数、开窗函数、分析窗口函数,其实说的都是一类函数
开窗函数用于为行定义一个窗口(这里的窗口是指运算将要操作的行的集合),它对一组值进行操作,不需要使用GROUP BY子句对数据进行分组,能够在同一行中同时返回基础行的列和聚合列。
over(partition by 列名1,列名2 …… order by 列名3,列名4 …… [desc])
括号中的两个关键词partition by 和order by 可以只出现一个。
partition by 和order by 后面的列名可以根据需求设定任意数量个列名。
order by后面可以选择是否跟desc,加上为倒序排序(从大到小),不加则默认为从小到大排序。
over() 前面是一个函数。
sum(columns) over (partition by col1 order by col2 rows between n/unbounded preceding and m following/current row )
如果不指定rows between,默认为从起点到当前行;
如果不指定order by,则将分组内所有值累加;
关键是理解rows between含义,也叫做window子句:
在Hive中开窗函数按功能主要分为以下四类:
Hive中提供了很多分析函数,用于完成负责的统计分析。先看看基础的sum,avg,min,max,用于实现分组内所有和连续累计的统计。
数据准备:
新建test.txt文件,输入如下的三列数据,以空格分隔。第一列是月份,第二列代表商铺名称,第三列代表该商铺该月营业额(万元)。
[root@hadoop ~]# vim test.txt
2019-01 a 10
2019-02 a 20
2019-03 a 30
2019-01 b 10
2019-02 b 20
2019-03 b 30
在hive中新建表temp_test9,将test文件中的数据插入,查看数据。
hive >CREATE TABLE temp_test9 (
>month STRING comment '月份',
>shop STRING comment '商铺名称',
>money STRING comment '营业额(万元)')
>row format delimited
>fields terminated BY ' ';
load data local inpath '/root/test.txt' into table temp_test9;
select * from temp_test9;
temp_test9.month temp_test9.shop temp_test9.money
2019-01 a 10
2019-02 a 20
2019-03 a 30
2019-01 b 10
2019-02 b 20
2019-03 b 30
1月的数据是1月的营业额
2月的数据是1月+2月的营业额
3月的数据是1月+2月+3月的营业额
hive >SELECT month,SUM(MONEY) OVER
>(ORDER BY month --按照月份进行排序,然后默认从起点行到当前行做累计求和) AS money_leiji
>FROM temp_test9
>WHERE shop = 'a'; --开窗函数不用写group by
结果:
month money_leiji
2019-01 10.0
2019-02 30.0
2019-03 60.0
hive >SELECT shop,month,SUM(MONEY)
>OVER (PARTITION BY shop ORDER BY month --先按照shop进行分组,然后每个组内再按照月份进行排序,最后默认从起点行到当前行做累计求和)
>AS money_leiji
>FROM temp_test9;
结果:
shop month money_leiji
a 2019-01 10.0
a 2019-02 30.0
a 2019-03 60.0
b 2019-01 10.0
b 2019-02 30.0
b 2019-03 60.0
1、累计统计,遇到重复行时不累加
sum(count(*)) over(order by count(*) desc )
2、累计统计,遇到重复行时也累加
sum(count(*)) over(order by count(*) desc rows between UNBOUNDED PRECEDING and current row )
其他的开窗函数和求和的累计逻辑都是相同的。
举例:
同时求出商店a、b每个月从1月累计到该月的平均营业额
hive >SELECT shop,month,AVG(MONEY) OVER
>(PARTITION BY shop ORDER BY month --先按照shop进行分组,然后每个组内再按照月份进行排序,最后默认从起点行到当前行做累计求均值)
>AS money_leiji
>FROM temp_test9;
结果:
shop month money_leiji
a 2019-01 10.0
a 2019-02 15.0
a 2019-03 20.0
b 2019-01 10.0
b 2019-02 15.0
b 2019-03 20.0
举例:
同时求出商店a、b每个月从1月累计到该月的营业额最大值
hive >SELECT shop,month,MAX(MONEY)
>OVER (PARTITION BY shop ORDER BY
>month --先按照shop进行分组,然后每个组内再按照月份进行排序,最后默认从起点行到当前行做累计求最大值)
>AS money_leiji_max
>FROM temp_test9;
结果:
shop month money_leiji_max
a 2019-01 10
a 2019-02 20
a 2019-03 30
b 2019-01 10
b 2019-02 20
b 2019-03 30
举例:
同时求出商店a、b每个月从1月累计到该月的营业额最小值
hive >SELECT shop,month,MIN(MONEY)
>OVER (PARTITION BY shop ORDER BY month --先按照shop进行分组,然后每个组内再按照月份进行排序,最后默认从起点行到当前行做累计求最小值)
>AS money_leiji_min
>FROM temp_test9;
结果:
shop month money_leiji_min
a 2019-01 10
a 2019-02 10
a 2019-03 10
b 2019-01 10
b 2019-02 10
b 2019-03 10