Hive分組取第一條記錄


需求

交易系統,財務要求維護每個用戶首個交易完成的訂單數據(首單表,可取每個用戶交易完成時間最老的訂單數據)。舉例:

簡寫版的表結構:

表數據:

則 財務希望匯總記錄如下:

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;


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM