levycui 发表于 2020-10-21 23:05:34

大数据技术之高频面试题(七):用户行为数据分析(上篇)

问题导读:
1、如何设计数仓分层架构表?
2、数据仓库有哪些层级?作用是什么?
3、如何设计用户活跃主题表?
4、如何设计用户新增主题表?


上一篇:大数据技术之高频面试题(六):涉及技术Spark

第5章 用户行为数据分析

5.1 数仓分层架构表

分层优点:复杂问题简单化、清晰数据结构(方便管理)、增加数据的复用性、隔离原始数据(解耦)

数仓中各层建的表都是外部表

5.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"
                }
            }
      ]
}
根据事件标签的不同可以分成不同的日志表

5.3 项目经验总结
5.3.1 项目经验之元数据备份
元数据备份(重点,如数据损坏,可能整个集群无法运行,至少要保证每日零点之后备份到其它服务器两个复本)

5.3.2 日期处理函数
1)date_format函数(根据格式整理日期)
2)date_add、date_sub函数(加减日期)
3)next_day函数
4)last_day函数(求当月最后一天日期)
5)collect_set函数
6)get_json_object解析json函数
5.3.3 Union与Union all区别
1)union会将联合的结果集去重,效率较union all差
2)union all不会对结果集去重,所以效率高

5.3.4 Shell中单引号和双引号区别

1)在/home/hadoop/bin创建一个test.sh文件
$ vim test.sh
在文件中添加如下内容
#!/bin/bash
do_date=$1

echo '$do_date'
echo "$do_date"
echo "'$do_date'"
echo '"$do_date"'
echo `date`

2)查看执行结果
$ sh test.sh 2019-02-10
$do_date
2019-02-10
'2019-02-10'
"$do_date"
2019年 05月 02日 星期四 21:02:08 CST

3)总结:
(1)单引号不取变量值
(2)双引号取变量值
(3)反引号`,执行引号中命令
(4)双引号内部嵌套单引号,取出变量值
(5)单引号内部嵌套双引号,不取出变量值

5.4 ods层
1)ods_start_log 启动日志表   
    只有一个字段 line(保存着json),按照日期dt分区,表的格式:lzo
2)ods_event_log    事件日志表(格式同启动日志表)
    只有一个字段 line ,按照日期dt 分区,表的格式:lzo

5.5 dwd层
1)dwd_start_log 启动表
    关键字段:mid_id,user_id,dt(分区字段,按照日期分区) (其实这是启动表和事件表的公共字段)
    从ods_start_log中的line用get_json_object(line,'$.mid') mid_id的方式获取字段

5.5.1 自定义UDF/UDTF(项目中的应用)
    自定义UDF函数(解析公共字段,一进一出)
    自定义UDTF函数(解析具体事件字段,一进多出)
自定义UDF:继承UDF,重写evaluate方法
    自定义UDTF:继承自GenericUDTF,重写3个方法:initialize(自定义输出的列名和类型),process(将结果返回forward(result)),close
为什么要自定义UDF/UDTF,因为自定义函数,可以自己埋点Log打印日志,出错或者数据异常,方便调试。

5.5.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    。

5.5.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


5.5.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张具体事件明细表


5.6 需求一:用户活跃主题
5.6.1 DWS层日活明细表


5.6.2 DWS层周活明细表


5.6.3 DWS层月活明细表


5.6.4 ADS层日周月活跃设备数表


5.7 需求二:用户新增主题
5.7.1 DWS层日新增明细表


5.7.2 ADS层每日新增设备数表




为梦狂野 发表于 2020-10-22 13:20:12

图画的真不错,挺好的。
页: [1]
查看完整版本: 大数据技术之高频面试题(七):用户行为数据分析(上篇)