假設乙個場景:存在表user_score,該錶的資料如下
[table]
|id|rate|score|
|1|'0-4'|10|
|2|'0-4'|40|
|3|'0-4'|30|
|4|'0-4'|20|
|5|'5-10'|10|
|6|'5-10'|40|
|7|'5-10'|30|
|8|'5-10'|20|
|9|'11-20'|10|
|10|'11-20'|40|
|11|'11-20'|30|
|12|'11-20'|20|
[/table]
現在要求用一條查詢語句取出每種rate下score最大的兩條記錄,也就算取出id為:2,3,6,7,10,11的記錄,要求分別給出sql和hivesql的查詢語句
以下是我的想到的方案:
sql:對user_score根據rate進行分割槽後根據score進行倒序排序,然後應用row_number函式於每個分割槽從而篩選出每個分割槽的前兩條記錄。
with pus as (
select *, rid = row_number() over
(partition by rete order by score desc) from user_score
)select id, rate, score from pus where rid <= 2
hivesql: hive中不存在以上sql的那種實現方式,row_number()在hive中是乙個函式,必須帶乙個或者多個列引數,如row_number(col1, ....),它的作用是按指定的列進行分組生成行序列,在row_number(a,b) 時,若兩條記錄的a,b列相同,則行序列+1,否則重新計數。因為hive是基於mapreaduce的,必須保證row_number執行是在reduce中,並且row_number中使用的列中,列值相同的記錄要再同乙個reduce中,否則row_number的行為是無意義的。
select id, rate, score from(select * from user_score distribute by rate sort by rete asc, score desc) where row_number(rete) <= 2
這裡有兩點需要說明:
[list]
[*]使用子查詢保證row_number在reduce端執行。
[*]使用by rate sort by rete asc, score desc 來保證rate相同的記錄被分配到相同的reduce中。
[/list]
HIVE中ROW NUMBER 函式的講解
row number over partition by column1 order by column2 select id,dept,salary,row number over partition by dept order by salary id dept salary row numbe...
Hive的分組排序方法 row number
這個方法總而言之就是幫助使用者減少工作量 比如,如下結構 create table user order user id int comment 使用者id pro id int comment 產品id value string comment 查出每個使用者買的價值最高的兩個用品,如果不用row...
Hive 用ROW NUMBER取每組top n
天用hive查資料時需要取每個分組的第一條資料,查了一發現hive 已經從0.11.0版本加入row number函式,可以滿足查詢的需求。row number 是從1開始,按照順序,生成分組內記錄的序列 用法如下 row number over partition by column a orde...