hive分組去前幾條資料
阿新 • • 發佈:2019-02-05
需求
交易系統,財務要求維護每個使用者首個交易完成的訂單資料(首單表,可取每個使用者交易完成時間最老的訂單資料)。舉例:
簡寫版的表結構:
表資料:
則 財務希望彙總記錄如下:
uid | order_id | service_completion_time |
---|---|---|
2 | 44 | 2017-02-03 12:23:01.0 |
3 | 33 | 2017-11-30 12:23:01.0 |
hive分組排序函式
語法:row_number() over (partion by fieldA order by fieldB desc) rank
含義:表示根據fieldA分組,在分組內部根據fieldB排序,而row_number() 函式計算的值就表示每組內部排序後的行編號(該編號在組內是連續並且唯一的)。
注意: rank 在這裡是別名,可任意
partition by:類似於Hive的建表,分割槽的意思。
order by : 排序,預設是升序,加desc降序。
需求實現
彙總首單:
select * from (
select
uid , order_id ,service_completion_time ,
row_number() over ( partition by uid order by service_completion_time asc ) num
from
dj_mart_zfpt.test
) last
where last .num = 1 ;
按uid分組,服務完成時間排序,給每個使用者的訂單編號。編號最新的(也就是1)就是該使用者的首單。
分批匯總:
由於訂單越來越多,所以每次不可能全量彙總,為了效能考慮,可以彙總每天每個使用者當天的首單,然後往歷史首單表插入,如果該uid在歷史首單表裡已存在,就不插入;否則,說明是該使用者真正的首單,則錄入歷史首單表。
實現:
可以通過歷史首單表與本日首單表做右連線或者左連線來插入新的首單記錄到歷史首單表:
右連線文氏圖:
insert into table dj_mart_zfpt.t_trade_new_customer
select new.* from dj_mart_zfpt.t_trade_new_customer old right join (
select * from (
select
uid , order_id ,service_completion_time ,
row_number() over ( partition by uid order by service_completion_time asc ) num
from
dj_mart_zfpt.test
) last where last.num = 1
) new on old.uid = new.uid where old.uid is null;