面试系列六 之 用户行为数据分析
關注我的公眾號【寶哥大數(shù)據(jù)】,更多干貨等著你
1.1、數(shù)倉分層架構(gòu)
分層優(yōu)點:復雜問題簡單化、清晰數(shù)據(jù)結(jié)構(gòu)(方便管理)、增加數(shù)據(jù)的復用性、隔離原始數(shù)據(jù)(解耦)
| 層級 | 功能 |
|---|---|
| ods | 原始數(shù)據(jù)層 存放原始數(shù)據(jù),保持原貌不做處理 |
| dwd | 明細數(shù)據(jù)層 對ods層數(shù)據(jù)清洗(去除空值,臟數(shù)據(jù),超過極限范圍的數(shù)據(jù)) |
| dws | 服務數(shù)據(jù)層 輕度聚合 |
| ads | 應用數(shù)據(jù)層 具體需求 |
數(shù)倉中各層建的表都是外部表
1.2、埋點行為數(shù)據(jù)基本格式(基本字段)
公共字段:基本所有安卓手機都包含的字段
業(yè)務字段:埋點上報的字段,有具體的業(yè)務類型
下面就是一個示例,表示業(yè)務字段的上傳。
行為數(shù)據(jù)啟動日志/事件日志表關鍵字段:
{
"ap":"xxxxx",//項目數(shù)據(jù)來源 app pc
"cm": { //公共字段
"mid": "", // (String) 設備唯一標識
"uid": "", // (String) 用戶標識
"vc": "1", // (String) versionCode,程序版本號
"vn": "1.0", // (String) versionName,程序版本名
"l": "zh", // (String) 系統(tǒng)語言
"sr": "", // (String) 渠道號,應用從哪個渠道來的。
"os": "7.1.1", // (String) Android系統(tǒng)版本
"ar": "CN", // (String) 區(qū)域
"md": "BBB100-1", // (String) 手機型號
"ba": "blackberry", // (String) 手機品牌
"sv": "V2.2.1", // (String) sdkVersion
"g": "", // (String) gmail
"hw": "1620x1080", // (String) heightXwidth,屏幕寬高
"t": "1506047606608", // (String) 客戶端日志產(chǎn)生時的時間
"nw": "WIFI", // (String) 網(wǎng)絡模式
"ln": 0, // (double) lng經(jīng)度
"la": 0 // (double) lat 緯度
},
"et": [ //事件
{
"ett": "1506047605364", //客戶端事件產(chǎn)生時間
"en": "display", //事件名稱 啟動和事件日志是根據(jù)事件名稱的不同
"kv": { //事件結(jié)果,以key-value形式自行定義
"goodsid": "236",
"action": "1",
"extend1": "1",
"place": "2",
"category": "75"
}
}
]
}
根據(jù)事件標簽的不同可以分成不同的日志表
1.3、各個層的表介紹
1.3.1、ods層
1)ods_start_log 啟動日志表
只有一個字段 line(保存著json),按照日期dt分區(qū),表的格式:lzo
2)ods_event_log 事件日志表(格式同啟動日志表)
只有一個字段 line ,按照日期dt 分區(qū),表的格式:lzo
1.3.2、dwd層
1)dwd_start_log 啟動表
關鍵字段:mid_id,user_id,dt(分區(qū)字段,按照日期分區(qū)) (其實這是啟動表和事件表的公共字段)
從ods_start_log中的line用get_json_object(line,'$.mid') mid_id的方式獲取字段
1.3.2.1、自定義UDF/UDTF(項目中的應用)
自定義UDF函數(shù)(解析公共字段,一進一出)
自定義UDTF函數(shù)(解析具體事件字段,一進多出)
自定義UDF:繼承UDF,重寫evaluate方法
自定義UDTF:繼承自GenericUDTF,重寫3個方法:initialize(自定義輸出的列名和類型),process(將結(jié)果返回forward(result)),close
為什么要自定義UDF/UDTF,因為自定義函數(shù),可以自己埋點Log打印日志,出錯或者數(shù)據(jù)異常,方便調(diào)試。
1.3.2.2、事件日志基礎明細表
dwd_base_event_log 事件日志基礎明細表
1)關鍵字段:
公共字段:mid_id,user_id,dt(分區(qū)字段)以及event_name、event_json、server_time
2)從 ods_event_log的line 中用 UDF 獲取 公共字段 和 server_time,用UDTF 獲取 event_name , event_json。
1.3.2.3、商品點擊表
dwd_display_log 商品點擊表
關鍵字段:公共字段 + 特有字段
從dwd_base_event_log中直接獲取公共字段和server_time,從 dwd_base_event_log的 event_json中獲取特有字段,where event_name = "display"
get_json_object(event_json,'$.kv.action') action
1.3.2.4、其他的具體事件明細表
類似
| 表明 | 表注釋 |
|---|---|
| dwd_newsdetail_log | 商品詳情頁表 |
| dwd_loading_log | 商品列表頁表 |
| dwd_ad_log | 廣告表 |
| dwd_notification_log | 消息通知表 |
| dwd_active_foreground_log | 用戶前臺活躍表 |
| dwd_active_background_log | 用戶后臺活躍表 |
| dwd_comment_log | 評論表 |
| dwd_favorites_log | 收藏表 |
| dwd_praise_log | 點贊表 |
| dwd_error_log | 錯誤日志表 |
從一張事件基礎明細表dwd_base_event_log一共可以獲得11張具體事件明細表
二、需求解析
2.1、用戶活躍主題
2.1.1、DWS層日活明細表
每日活躍設備分析
2.1.2、DWS層周活明細表
每周活躍設備分析
2.1.3、DWS層月活明細表
每月活躍設備分析
2.1.4、ADS層日周月活躍設備數(shù)表
活躍設備分析
2.2、用戶新增主題
2.2.1、DWS層日新增明細表
2.2.2、ADS層每日新增設備數(shù)表
2.3、用戶留存主題
2.3.1、用戶留存介紹
2.3.2、用戶留存率分析
2.3.3、DWS層日留存明細表
2.3.4、ADS層留存用戶數(shù)表
2.3.5、ADS層留存用戶率表
2.4、沉默用戶
2.5、本周回流用戶數(shù)
2.6、流失用戶數(shù)
2.7、最近連續(xù)3周活躍用戶數(shù)
2.8、最近七天內(nèi)連續(xù)三天活躍用戶數(shù)
2.9、需求邏輯
2.9.1 如何分析用戶活躍?
在啟動日志中統(tǒng)計不同設備id出現(xiàn)次數(shù)。
2.9.2 如何分析用戶新增?
用活躍用戶表 left join 用戶新增表,用戶新增表中mid為空的即為用戶新增。
2.9.3 如何分析用戶1天留存?
留存用戶=前一天新增 join 今天活躍
用戶留存率=留存用戶/前一天新增
2.9.4 如何分析沉默用戶?
(登錄時間為7天前,且只出現(xiàn)過一次)
按照設備id對日活表分組,登錄次數(shù)為1,且是在一周前登錄。
2.9.5 如何分析本周回流用戶?
本周活躍left join本周新增 left join上周活躍,且本周新增id和上周活躍id都為null
2.9.6 如何分析流失用戶?
(登錄時間為7天前)
按照設備id對日活表分組,且七天內(nèi)沒有登錄過。
2.9.7 如何分析最近連續(xù)3周活躍用戶數(shù)?
按照設備id對周活進行分組,統(tǒng)計次數(shù)大于3次。
2.9.8 如何分析最近七天內(nèi)連續(xù)三天活躍用戶數(shù)?
1)查詢出最近7天的活躍用戶,并對用戶活躍日期進行排名
2)計算用戶活躍日期及排名之間的差值
3)對同用戶及差值分組,統(tǒng)計差值個數(shù)
4)將差值相同個數(shù)大于等于3的數(shù)據(jù)取出,然后去重(去的是什么重???),即為連續(xù)3天及以上活躍的用戶
總結(jié)
以上是生活随笔為你收集整理的面试系列六 之 用户行为数据分析的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Android LinearLayout
- 下一篇: 摄像头安全隐患检测和防护方法