hive使用rank實現topN的查詢

2021-07-08 21:51:36 字數 2604 閱讀 1712

前置條件:

安裝好hive

背景:

hive表中存有cookieid和time兩個字段

目標:

通過rank方法查出每個cookieid在哪一天的次數最多

具體步驟如下:

create

external

table tmp_dh_topn (

cookieid string,

vtime string --day

) row format delimited

fields terminated by

','stored as textfile location '/tmp/dh/tmp_dh_topn/';

資料檔案存放在/tmp目錄下,把資料匯入hive的tmp_dh_topn表中

load data local inpath '/tmp/tmp_topn.txt'

into

table tmp_dh_topn;

select cookieid, vtime, count(vtime) as pv

from tmp_dh_topn

group

by cookieid, vtime

order

by cookieid, vtime

得到結果如下:

cookie1 2015-04-10      3

cookie1 2015-04-11 3

cookie1 2015-04-12 3

cookie1 2015-04-13 2

cookie1 2015-04-14 2

cookie1 2015-04-15 1

cookie2 2015-04-10 3

cookie2 2015-04-11 3

cookie2 2015-04-12 3

cookie2 2015-04-13 2

cookie2 2015-04-14 2

cookie2 2015-04-15 1

select cookieid, vtime, pv, rank() over (partition by cookieid order

by pv desc, vtime desc) as pv_rank from (

select cookieid, vtime, count(vtime) as pv

from tmp_dh_topn

group

by cookieid, vtime

order

by cookieid, vtime

) tmp_dh_pv

使用rank方法能把結果進行排序,over中的partition是進行排序分割槽,order by是在內部排序時的條件。這裡的意思是在每個cookieid分組在按照pv、vtime來進行排序,最後得出結果。

得到結果如下:

cookie1 2015-04-12      3       1

cookie1 2015-04-11 3 2

cookie1 2015-04-10 3 3

cookie1 2015-04-14 2 4

cookie1 2015-04-13 2 5

cookie1 2015-04-15 1 6

cookie2 2015-04-12 3 1

cookie2 2015-04-11 3 2

cookie2 2015-04-10 3 3

cookie2 2015-04-14 2 4

cookie2 2015-04-13 2 5

cookie2 2015-04-15 1 6

select cookieid, vtime, pv from (

select cookieid, vtime, pv, rank() over (partition by cookieid order

by pv desc, vtime desc) as pv_rank from (

select cookieid, vtime, count(vtime) as pv

from tmp_dh_topn

group

by cookieid, vtime

order

by cookieid, vtime

) tmp_dh_pv

)where pv_rank = 1;

最後一步,去pv_rank為1就是得到次數最多的那個記錄。

得到的結果如下:

cookie1 2015-04-12      3

cookie2 2015-04-12 3

hive使用rank實現topN的查詢

前置條件 安裝好hive 背景 hive表中存有cookieid和time兩個字段 目標 通過rank方法查出每個cookieid在哪一天的次數最多 具體步驟如下 一 建立表 create external table tmp dh topn cookieid string,vtime string...

Hive開窗函式和Rank函式

over 跟在聚合函式後面,指定分析函式工作的資料視窗大小,決定了資料的聚合範圍,預設範圍是整個資料視窗,即所有行。可使用partition by將資料進行分組聚合 使用order by除了排序 預設asc公升序 還會改變聚合範圍 從開始行到當前行的聚合 使用distribute by sort b...

用mysql實現rank()排序

mysql中不存在類似於sql server或orcal中的rank 函式來得到排名。而在實際的工作中,常常需要將查詢後排序得到的排名給記錄下來。由於專案需要,不僅要對成績進行排名,而且需要相同成績的具有相同的排名。根據網上的提供的排名方法,進一步進行擴充,得到了下面的實現方式。表 score,有三...