Hive使用窗口函數分時間間隔規劃用戶會話-lag/sum

背景

用戶可能在app上活躍多次,而這多次界定爲半個鍾,也就是說,假如我7點到8點這段期間使用了app且進行了活躍操作,隔了半個鍾後我重新打開了app進行了活躍的操作,假設活躍時間區間爲12點到13點,那麼,7-8點這段時間我們定爲session1,12-13點這段時間我們定爲session2

思路

根據時間戳reporttime來針對用戶進行排序,獲取這段期間的動作時間裏線,使用lag進行判別,假設本次動作與上次動作時間間隔操作1800s(半個鍾) 那麼就賦予1作爲標識

實現

select
    tdbank_imp_date -- string  partition fields
    ,uin -- string  QQ或微信
    ,module --  string  業務模塊
    ,action --  string  用戶行爲
    ,obj2 --    string  對象2
    ,platform --    string  平臺(iOS、Android等)
    ,source --  string  來源
    ,timelong --    bigint  時長
    -- ,timestr -- string  上報時間
    ,reporttime	--	string	數據上報時間戳(後臺默認添加,精確到秒,如1556436373)
    ,is_new -- 1 表示新用戶,0表示老用戶
	,sum(if(reporttime - pre_rt > 1800, 1, 0)) over(partition by uin order by reporttime asc) as session_id
	,pre_rt
from 
(

select
    tdbank_imp_date -- string  partition fields
    ,uin -- string  QQ或微信
    ,module --  string  業務模塊
    ,action --  string  用戶行爲
    ,obj2 --    string  對象2
    ,platform --    string  平臺(iOS、Android等)
    ,source --  string  來源
    ,timelong --    bigint  時長
    -- ,timestr -- string  上報時間
    ,reporttime	--	string	數據上報時間戳(後臺默認添加,精確到秒,如1556436373)
    ,is_new
	,lag(reporttime, 1,  unix_timestamp()) over(partition by uin order by reporttime asc) as pre_rt
from 
(
select 
    tdbank_imp_date -- string  partition fields
    ,tb1.uin -- string  QQ或微信
    ,module --  string  業務模塊
    ,action --  string  用戶行爲
    ,obj2 --    string  對象2
    ,platform --    string  平臺(iOS、Android等)
    ,source --  string  來源
    ,timelong --    bigint  時長
    -- ,timestr -- string  上報時間
    ,reporttime	--	string	數據上報時間戳(後臺默認添加,精確到秒,如1556436373)
    ,if(tb2.uin is not null, 1, 0) as is_new -- 1 表示新用戶,0表示老用戶
from 
(
select 
    tdbank_imp_date -- string  partition fields
    ,uin -- string  QQ或微信
    ,module --  string  業務模塊
    ,action --  string  用戶行爲
    ,obj2 --    string  對象2
    ,platform --    string  平臺(iOS、Android等)
    ,source --  string  來源
    ,timelong --    bigint  時長
    -- ,nvl(timestr, reporttime) as timestr -- string  上報時間
    ,nvl(reporttime, timestr) as reporttime	--	string	數據上報時間戳(後臺默認添加,精確到秒,如1556436373)


FROM
base_report_tb
WHERE
tdbank_imp_date between  ${YYYYMMDD}00 AND  ${YYYYMMDD}23  
) tb1 left join
(
select
    uin
FROM
    new_users
WHERE ftime = ${YYYYMMDD}

) tb2 on tb1.uin = tb2.uin
) t 
) t2
-- limit 100000



-- is_new -- 是否新用戶
-- session_id -- 會話id
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章