Abstract
Background
As the number of users increases,the volume of business and data also increases.In order to improve the
company’s business conversion rate and operation, building a data warehousecan better manage and maintain
user behavior data,and conduct statistical analysis on users’ online access behavior,consumption behavior
and business behavior to support the company’s operation.
Address
Blog
Technology Selection
Data acquisition and transmission :Flume Kafka Sqoop
Storage :Hdfs Mysql Hbase Redis
Calculate :Hive Spark MapReduce
Inquire :Presto Kylin
Visualization :Superset Sersors
Scheduling:Azkaban
Metadata management:Atlas
Explain
One of the key points of the project is that only good quality data can produce correct decisions,
ETL is important. The second key point is the methodology of dimension modeling, which is business oriented.
The third key point is to realize the automation and maintainability of data warehouse without obstacles
Explain the project and sort out the actual production process.
The process of collecting behavioral data from the log server,collecting business data from the business
database to the data warehouse, and the architecture of the data warehouse and the association of
various tables are briefly explained.
https://www.jianshu.com/writer#/notebooks/48164698/notes/81982588
ODS -> DWD(用户行为数据分析)
维度集成
GeoHash编码
1 | //经纬度字典表存入数据库 |
IDMapping
方案一:IDBind评分
步骤
score表的构成deviceID account score timestamp
1.创建今天的bind表:
由两个部分union all 组成
第一部分:今天的新设备
过滤出今天表没有account的数据,与昨天的bind表join 并且deviceid is null
第二部分今天的账号不为空的的数据(都为空没有讨论的必要)
要点:如何设置表的字段
设备只要昨天出现过就取昨天的,否则今天的
账号只要昨天出现过就取昨天的,否则今天的
时间戳取最大的
score(今天deviceid和昨天都出现则分数相加,今天出现昨天没有分数不变,今天没有出现昨天出现分数衰减)
2.创建今天guid字段
获取今天的评分表,获取同一个设备组的最大分数数据,今天的log表与这个处理过的评分表left join
规则:
如果今天的account不为空guid就取这个
否则获取评分表的account,guid为评分表的account,这个情况是处理没有今天数据没有account字段的情况
否则其他情况guid就是今天的设备号
代码
1 |
|
方案二:图计算
1 | object GraphxUniqueLdentification { |
新老用户标识
方案一:布隆过滤器
1 | //测试布隆过滤器 |
方案二:Spark广播变量
把表中的deviceid account字段 广播出去即可,如果两个字段都存在则 isnew =1
方案三:join
full join 昨天和今天的guid,如果如果今天的为空就是新用户
DWD -> DWS(用户行为数据分析)
流量/用户分析主题
会话聚合表(轻度聚合)
按用户会话粒度聚合可以支持多种报表,例如:访问次数,访问深度(定义包括重复的页面),跳出页,流量对比等
轻度聚合是对个体的统计,,统计个体只要对guid分组即可
1 | -- 从DWD表enent_app_detail,按照用户会话粒度聚合 |
流量用户聚合表
按用户维度进行聚合,是对会话维度聚合表进行进一步的聚合
多维立方体(高阶聚合)
实际生产中在各种指标下的统计有各种维度组合,工作繁冗
关键要点:创建一个统一的目标维度,这个表应该包含所有的可能性维度字段
利用hive的高阶聚合函数,在一条SQL中实现可能的维度组合
高阶聚合不是对个体的统计,是对全局的统计
with cube 函数包含所有可能的组合
grouping sets() 用户自定义所有可能的组合
with rollup 右到做递减多级的统计
1 | -- 多维组合表 |
1 | !/bin/bash |
用户活跃度分析主题
类拉链表
步骤一: dw.traffic_aggr_session会话表计算今天登录的用户guid
步骤二:昨天的活跃表与今天的日活表full join;计算的规则:
first_dt guid range_start 规则是一致的,只要昨天有那就是昨天的,否则今天的(这种情况是新用户了)
range_end 规则:如果昨天登录了,今天没有登录,那就昨天日期,连续中断要封存,如果昨天没有但是有那就今天的(新用户),其他情况一律是昨天日期(昨天用户今天没有登录的情形,封闭区间保持原样)
步骤三:一种情形没有full jion上:之前存在的用户今天登陆的( max(range_end) != ‘9999-12-31’),所以要union all
从活跃表中获取这种用户的guid和first_dt与日活表left semi join
1 | -- 类拉链表 |
1 | -- 获取今日登陆的人数 |
1 | -- 报表分析-连续活跃区间分布 |
bitMap思想
计算方案
步骤一:去重按照guid datime
步骤二:按照guid来分组聚合
使用sum(pow(2,datediff(时间,dt))) 类型为double,sum的结果是登陆数的和
把上述的结果转换为bin() 说明最近登陆的在bitmap的最右边,考虑使用lpad()来补全
考虑使用reverse来反转,这样最左边就是最近登陆的天数
步骤三:更新这个bitmap表
与今天的表进行join,on guid
对这个bitmap进行补全,补全的规则如下:
substr(1,1,30),今天和bitmap表的都有则+1 今天有bitmap表无则是新的guid 今天无bitmap表有说明没有登录+0
1 | -- 测试数据 |
用户连续活跃分析
1 | //连续活跃天数 |
用户访问间隔分析
1 | //用户访问间隔分析 |
1 | //用户访问间隔分析 |
新用户留存分析主题
新用户留存报表

1 | -- 基于流量/用户活跃度分析主题 |
用户事件分析主题
1 | -- 按照用户和事件两个维度进行聚合,统计出每个用户的行为记录 |
漏斗模型分析主题
业务路径概况统计
1 | create table dw.funnel_statistic_1d |
1 | -- 访问路径明细表 |
事件归因分析主题*
归因分析是对用户复杂的消费行为路径的分析,归因分析(Attribution Analysis)要解决的问题就是广告效果的产生,其功劳应该如何合理的分配给哪些渠道。
末次触点分析:转化路径少周期短的业务,或者就是起临门一脚作用的广告,为了吸引客户购买,点击直接落地到商品详情页
首次触点分析:这种模型适用于没什么品牌知名度的公司,关注能给他们带来客户的最初的渠道,对于扩展市场很有帮助的渠道
末次非直接点击归因:业务的直接流量大部分都被来自于被其他渠道吸引的客户,需要排除掉直接流量
线性归因分析:根据线性归因模型的特点,他更适用于企业期望在整个销售周期内保持与客户的联系,并维持品牌认知度的公司.在这种情况下,各个渠道在客户的考虑过程中,都起到相同的促进作用
时间衰减归因分析:客户决策周期短、销售周期短的情况,比如,做短期的促销,就打了两天的广告,那么这两天的广告理应获得较高的权重
U型归因分析:混合使用了首次互动归因和末次互动归因
1 | object FactorAnalysis { |
ODS->DWD(业务数据分析)
Sqoop
1 | -- sqoop安装流程略 |
1 | -- query查询导入,先导入--target-dir 指定的 HDFS 的目录中 |
1 | -- 导入到hive分区,手动 alter table db_demo1.geo1 add partition (dt='2020-12-23'); |
增量表和全量表
增量表
特征每个分区就是业务数据每天更新的数据
怎么从业务系统导入
方法一:取某个时间戳之后的数据(即为今天更新的数据)
方法二:递增字段,这个场景适用于递增数据库
全量表
为什么不直接从业务系统导出全部的数据?因为业务系统这张表可能数据过多,而数据系统是分布式的,对系统压力小
今天的增量数据 与全量表的数据 full join (能join上的就取增量表的,不能join上的就是新的用户/没有更新的数据,把join的结果添加到今天的分区,关于是否要保存全量表昨天分区的数据,可以保存相当于快照,可以采用类拉链表的方法来更新全增表,这样数据就会减少)
对全量表和增量表的论述在《大数据系统构建原理与最佳实践》有详细的解释
1 | -- 一个关于类拉链表的案例 |
DWD->DWS(业务数据分析)
报表分析示例
1 | -- 复购率分析 |
用户行为画像
订单标签
1 |
|
偏好标签
1 | -- 用户购物偏好标签 |
Task Scheduling
Azkaban
1 | -- 安装略 |
Metadata Management
Atlas
1 | 安装略 |
User Profile
朴素贝叶斯算法示例
1 | -- 示例一:图像的简单识别:构建特征工程(矩阵) 略 |
KNN算法示例
1 | //label,f1,f2,f3,f4,f5 simple |
TF-IDF算法示例
1 | //TF 词频 |
逻辑回归算法示例
1 | //流失率预测 |
模型评估示例
1 | 1. 混淆矩阵(Confusion Matrix): |
OLAP
Hbase row key设计
1 | 1. Region热点问题的解决 |
Kylin
1 | 1. cube的构建流程 |
Presto
SuperSet
安装教程: https://www.jianshu.com/p/36a7e1cf97b5
请学习官方文档 https://superset.apache.org/