本文部分參考自:https://blog.csdn.net/qq_23897391/article/details/100558433
Hive第六天——Hive函數
自己的話:千里之行,始於足下。
每天都要保持前進,我勢必要有強勁的實力,再跟明天的自己問好。
開窗函數:累計統計
這類函數叫法很多,包括分析函數、窗口函數、開窗函數、分析窗口函數,其實說的都是一類函數
一、開窗函數簡介
開窗函數用於爲行定義一個窗口(這裏的窗口是指運算將要操作的行的集合),它對一組值進行操作,不需要使用GROUP BY子句對數據進行分組,能夠在同一行中同時返回基礎行的列和聚合列。
二、開窗函數語法
1.開窗函數的語法爲:
-
over(partition by 列名1,列名2 …… order by 列名3,列名4 …… [desc])
-
括號中的兩個關鍵詞partition by 和order by 可以只出現一個。
-
partition by 和order by 後面的列名可以根據需求設定任意數量個列名。
-
order by後面可以選擇是否跟desc,加上爲倒序排序(從大到小),不加則默認爲從小到大排序。
-
over() 前面是一個函數。
2.分段解析:
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子句:
- preceding:往前
- following:往後
- current rows:當前行
- unbounded:起點
- unbounded preceding:表示從前面的起點
- unbounded following:表示到後面的終點
三、開窗函數分類
在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.累計求和 sum(xx) over
(1)求商店a每個月從1月累計到該月的總營業額,即:
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
(2)同時求出商店a、b每個月從1月累計到該月的總營業額
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 )
2.累計求平均值 avg(xx) over
其他的開窗函數和求和的累計邏輯都是相同的。
舉例:
同時求出商店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
3.累計求最大值 max(xx) over
舉例:
同時求出商店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
4.累計求最小值 min(xx) over
舉例:
同時求出商店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