Hive第六天——Hive函數(開窗函數之累計統計)


本文部分參考自: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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章