Hive窗口函數row_number案例

數據文件是:rownumbertest.txt,字段信息是:id,xb,age,name

1,男,18,張三
2,女,18,李四
3,女,20,王五
4,男,18,趙六
5,男,18,劉七
6,男,19,石九
7,男,38,黃渤
8,女,22,劉嘉玲
9,女,23,王菲
10,女,28,劉亦菲
11,女,18,趙麗穎

用戶信息表

create database if not exists hive_test;
use hive_test;
drop table if exists rownumbertest;
create table rownumbertest(id int, xb string, age int, name string) row format
delimited fields terminated by ",";
load data local inpath "/home/hadoop/rownumbertest.txt" into table
rownumbertest;
select * from rownumbertest;

數據結果展示:

id      xb     age    name   rank
1       男      18      張三    5
2       女      18      李四    6
3       女      20      王五    4
4       男      18      趙六    4
5       男      18      劉七    3
6       男      19      石九    2
7       男      38      黃渤    1
8       女      22      劉嘉玲  3
9       女      23      王菲    2
10      女      28      劉亦菲  1
11      女      18      趙麗穎  5

需求:每種性別人群中,年齡最大的兩個人
TopN的需求:分組取前幾
核心思路:

如果能實現一個操作:
把每一條記錄再對應的組中的編號如果能生成出來的話。那么下面的這個SQL能很容易的求出結果
select * from rownumbertest where rank <= 2;

distribute by 和 sort by 搭配使用

select a.id, a.xb, a.age, a.name, row_number() over(distribute by a.xb sort by
a.age desc) as rank from rownumbertest a;

partition by 和 order by 搭配使用

select id,xb,age,name, row_number() over (partition by xb order by age desc) as
index from rownumbertest;
+-----+-----+------+-------+--------+
| id | xb | age | name | index |
+-----+-----+------+-------+--------+
| 10 | 女 | 28 | 劉亦菲 | 1 |
| 9 | 女 | 23 | 王菲 | 2 |
| 8 | 女 | 22 | 劉嘉玲 | 3 |
| 3 | 女 | 20 | 王五 | 4 |
| 11 | 女 | 18 | 趙麗穎 | 5 |
| 2 | 女 | 18 | 李四 | 6 |
| 7 | 男 | 38 | 黃渤 | 1 |
| 6 | 男 | 19 | 石九 | 2 |
| 5 | 男 | 18 | 劉七 | 3 |
| 4 | 男 | 18 | 趙六 | 4 |
| 1 | 男 | 18 | 張三 | 5 |
+-----+-----+------+-------+--------+
select * from (select id,xb,age,name, row_number() over (partition by xb order
by age desc) as index from rownumbertest) abc where abc.index <= 3;
+---------+---------+----------+-----------+------------+
| abc.id | abc.xb | abc.age | abc.name | abc.index |
+---------+---------+----------+-----------+------------+
| 10 | 女 | 28 | 劉亦菲 | 1 |
| 9 | 女 | 23 | 王菲 | 2 |
| 8 | 女 | 22 | 劉嘉玲 | 3 |
| 7 | 男 | 38 | 黃渤 | 1 |
| 6 | 男 | 19 | 石九 | 2 |
| 5 | 男 | 18 | 劉七 | 3 |
+---------+---------+----------+-----------+------------+
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容