1. 程式人生 > >【hive】關於使用者留存率的計算

【hive】關於使用者留存率的計算

首先使用者留存率一般是面向新增使用者的概念,是指某一天註冊後的幾天還是否活躍,是以每天為單位進行計算的.
一般收到的需求都是一個時間段內的新增使用者的幾天留存

(1)找到這個時間段內的新增使用者(也可能含有地區啊的各種附加條件),一般在日活表中有記錄是否是新增狀態.
注意,需要以天為單位進行分組找出使用者的id.因為留存率都是以每天為單位進行計算的.
表結構(register_date,user_id)

(2)找到這個時間段內的活躍使用者(active_date,user_id)

(3)以 1表 為主表left join 2表 以user_id為關聯鍵,統計留存數

這樣後的記錄型別為:register_date,user_id,active_date

register_date為新增日期,即留存率的單位天.

user_id為使用者id,distinct user_id來計算使用者數

留存率怎麼算?
active_date - register_date = 1,說明註冊的次日使用者是活躍的,所以count+1
所以我們只要關注 active_date 和 register_date 相差天數即可統計留存數
取天數差的時候用datediff(active_date,register_date)來計算,active_date 和 register_date 的格式為 yyyy-MM-dd

(4)計算留存率

 

模板:

    SET mapreduce.job.queuename=xxx;
    SET mapreduce.job.name=xxx;
    set mapreduce.job.reduces=19;
            select '日期', '註冊使用者數', '次日留存率', '2日留存率', '3日留存率',  dim_date
                ,total_cnt
                ,concat_ws('% | ', cast(round(dif_1cnt*100/total_cnt, 2) as string), cast(dif_1cnt as
string)) ,concat_ws('% | ', cast(round(dif_2cnt*100/total_cnt, 2) as string), cast(dif_2cnt as string)) ,concat_ws('% | ', cast(round(dif_3cnt*100/total_cnt, 2) as string), cast(dif_3cnt as string)) ,concat_ws('% | ', cast(round(dif_4cnt*100/total_cnt, 2) as string), cast(dif_4cnt as string)) from ( select p1.state dim_date ,p1.device_os ,count(distinct p1.user_id) total_cnt ,count(distinct if(datediff(p3.state,p1.state) = 1, p1.user_id, null)) dif_1cnt ,count(distinct if(datediff(p3.state,p1.state) = 2, p1.user_id, null)) dif_2cnt ,count(distinct if(datediff(p3.state,p1.state) = 3, p1.user_id, null)) dif_3cnt ,count(distinct if(datediff(p3.state,p1.state) = 4, p1.user_id, null)) dif_4cnt from ( select from_unixtime(unix_timestamp(cast(partition_date as string), 'yyyyMMdd'), 'yyyy-MM-dd') state, user_id from user_active_day where partition_date between date1 and date2 and user_is_new = 1 group by 1,2 )p1 --日新增使用者名稱單(register_date,user_id) left outer join ( select from_unixtime(unix_timestamp(cast(partition_date as string), 'yyyyMMdd'), 'yyyy-MM-dd') state, user_id from active_users where partition_date between date1 and date2 group by 1,2 )p3 --期間活躍使用者(active_date,user_id) on (p3.user_id = p1.user_id) group by 1,2 ) p4;

友情附贈:

求使用者首充的時間,在充值表中以user_id分組,然後找出最小的訂單新增時間,對應的訂單就是首充的記錄.