小編給大家分享一下Hive如何分組取Top N,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!
為企業(yè)提供成都網(wǎng)站設(shè)計(jì)、網(wǎng)站建設(shè)、網(wǎng)站優(yōu)化、營銷型網(wǎng)站建設(shè)、競價(jià)托管、品牌運(yùn)營等營銷獲客服務(wù)。創(chuàng)新互聯(lián)擁有網(wǎng)絡(luò)營銷運(yùn)營團(tuán)隊(duì),以豐富的互聯(lián)網(wǎng)營銷經(jīng)驗(yàn)助力企業(yè)精準(zhǔn)獲客,真正落地解決中小企業(yè)營銷獲客難題,做到“讓獲客更簡單”。自創(chuàng)立至今,成功用技術(shù)實(shí)力解決了企業(yè)“網(wǎng)站建設(shè)、網(wǎng)絡(luò)品牌塑造、網(wǎng)絡(luò)營銷”三大難題,同時(shí)降低了營銷成本,提高了有效客戶轉(zhuǎn)化率,獲得了眾多企業(yè)客戶的高度認(rèn)可!
Hive在0.11.0版本開始加入了row_number、rank、dense_rank分析函數(shù),可以查詢分組排序后的top值
row_number() over ([partition col1] [order by col2] )
rank() over ( [partition col1] [order by col2] )
dense_rank() over ( [partition col1] [order by col2] )
它們都是根據(jù)col1字段分組,然后對(duì)col2字段進(jìn)行排序,對(duì)排序后的每行生成一個(gè)行號(hào),這個(gè)行號(hào)從1開始遞增
col1、col2都可以是多個(gè)字段,用','分隔
1)row_number:不管col2字段的值是否相等,行號(hào)一直遞增, 比如:有兩條記錄的值相等,但一個(gè)是第一,一個(gè)是第二
2)rank:上下兩條記錄的col2相等時(shí),記錄的行號(hào)是一樣的,但下一個(gè)col2值的行號(hào)遞增N(N是重復(fù)的次數(shù)),比如:有兩條并列第一,下一個(gè)是第三,沒有第二
3)dense_rank:上下兩條記錄的col2相等時(shí),下一個(gè)col2值的行號(hào)遞增1, 比如:有兩條并列第一,下一個(gè)是第二
row_number可以實(shí)現(xiàn)分頁查詢
創(chuàng)建表
create table t(name string, sub string, score int) row format delimited fields terminated by '\t';
數(shù)據(jù)在附件的a.txt里
a chinese 98 a english 90 d chinese 88 c english 82 c math 98 b math 89 b chinese 79 z english 90 z math 89 z chinese 80 e math 99 e english 87 d english 90 加載數(shù)據(jù) load data local inpath '/home/hadoop/hive-example/a.txt' into table tb4;
分組排序
--row_number select *, row_number() over (partition by sub order by score) as od from t; --rank select *, rank() over (partition by sub order by score) as od from t; --dense_ran select *, dense_rank() over (partition by sub order by score desc) from t;
--統(tǒng)計(jì)每個(gè)學(xué)科的前三名 select * from (select *, row_number() over (partition by sub order by score desc) as od from t ) t where od<=3; --語文成績是80分的排名是多少 select od from (select *, row_number() over (partition by sub order by score desc) as od from t ) t where sub='chinese' and score=80; --分頁查詢 select * from (select *, row_number() over () as rn from t) t1 where rn between 1 and 5;
以上是“Hive如何分組取Top N”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對(duì)大家有所幫助,如果還想學(xué)習(xí)更多知識(shí),歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道!