Hive窗口函數 row_number over()和sum() over()的使用詳解


row_number over()的使用:

假如我們有這樣一組數據,我們需要求出不同性別的年齡top2的人的信息。這個時候怎么做?
可能我們會首先想到分組,但是分組只能值top1,怎么樣能求出top2,top3呢?這時候我們想如果分組后能夠按照年齡排序然后標出來序號就好了!

id   age  name sex

1,18,xiaoli,male
2,19,wang,male
3,22,liu,female
4,16,dawei,male
5,30,erbao,male
6,26,xiao,female
7,18,chengua,male

下面就介紹一個非常有用的函數:row_number() over()他的作用就是分組排序加上序號標記
比如以上求解不同性別的年齡top2,我們可以這樣做:
建表導入數據:

create table rownumber(id string,age int,name string,sex string)
row format delimited
fields terminated by ',';
load data local inpath '/root/mytest/rowover.dat' into table rownumber;

select id,age,name,sex,
row_number() over(partition by sex order by age desc) as rownumber
from rownumber;


我們可以清楚的看到 row_number() over(partition by sex order by age desc) as rownumber
就相當於增加了一列序號,over()中partition by sex是按照sex分組,order by age desc按照年齡降序排序,然后row_number()在加上序號。

select id,age,name,sex
from
(select id,age,name,sex,
row_number() over(partition by sex order by age desc) as rownumber
from rownumber ) temp
where rownumber<3;


這樣就求出分組topn了,很方便!

sum() over()的使用:

有這樣的數據:第一列name,第二列月份mon,第三列金額jine
A,2015-01,5
A,2015-01,15
B,2015-01,5
A,2015-01,8
B,2015-01,25
A,2015-01,5
C,2015-01,10
C,2015-01,20
A,2015-02,4
A,2015-02,6
C,2015-02,30
C,2015-02,10
B,2015-02,10
B,2015-02,5
A,2015-03,14
A,2015-03,6
B,2015-03,20
B,2015-03,25
C,2015-03,10
C,2015-03,20

我們需要求出對於每個人的一個月的總額和累計到當前月的總額。
傳統方法非常的麻煩,具體思路是;先求出月總額表(name,mon,amount),然后講月總額表自聯結,在過濾當前月份后面的月份,最終在求和。
使用sum() over()可以輕松給解決,sum()首先我們都知道是求和,加上over()就是針對某個窗口求和了,具體哪個窗口呢?
具體實現:
求出每月的總額 放到表中,先將數據加載到表中,在求月總額

create table monsum(name string,mon string,jine string)
row format delimited
fields terminated by ',';
load data local inpath '/root/mytest/sumreport.dat' into table monsum;
 
--求出月總額
create table monamount 
as
select name,mon,sum(jine) as amount
from monsum
group by name,mon;


然后使用窗口函數求出累計當前月總額,

select name,mon,amount,
sum(amount) over(partition by name order by mon rows between unbounded preceding and current row) as account
from monamount;


sum(amount)的求和是針對后面over()窗口的求和,
over中partition by name order by mon 針對name這一組按照月份排序,rows between unbounded preceding and current 限定了行是按照在當前行不限定的往前處理,通俗就是處理當前以及之前的所有行的sum,即3月時sum(amount)求的時123月的和,2月時sum(amount)求的是12月的和。unbounded意思無限的 preceding在之前的,current row當前行。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM