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