《大型综合项目-基于大数据平台的数据仓库》学习笔记(08):ID-MAPPING
《⼤型综合项⽬-基于⼤数据平台的数据仓库》学习笔记(08):ID-MAPPING
本项⽬教程笔记源⾃多易教育《Titan综合数据仓库与数据运营系统》,在CSDN学院有相关视频教程购买链接,
本项⽬课程是⼀门极具综合性和完整性的⼤型⼤数据项⽬实战课程,课程项⽬的业务背景源⾃各类互联⽹公司对海量⽤户浏览⾏为数据和业务数据分析的需求及企业数据管理、数据运营需求。
学完本课程,你将很容易就拿到⼤数据数仓建设或⽤户画像建设等岗位的OFFER
本课程项⽬涵盖数据采集与预处理、数据仓库体系建设、⽤户画像系统建设、数据治理(元数据管理、数据质量管理)、任务调度系统、数据服务层建设、OLAP即席分析系统建设等⼤量模块,⼒求原汁原味重现⼀个完备的企业级⼤型数据运营系统。
跟随项⽬课程,历经接近100+⼩时的时间,从需求分析开始,到数据埋点采集,到预处理程序代码编写,到数仓体系搭建…逐渐展开整个项⽬的宏⼤视图,构建起整个项⽬的摩天⼤厦。
⼀、id-mapping概述
在后续的数仓、画像、推荐等模块开发中,我们都需要对每⼀条⾏为⽇志数据标记⽤户的唯⼀标识!
简单的⽅案是
将这条数据中的uid/imei码/imsi码/mac/androidid/uuid这些字段(标识字段)按优先级取⼀个标识,作为这条数据的⽤户唯⼀标识!
四不伤害是指什么
这个⽅案有严重的漏洞!
现实的⽆奈
在现实的⽇志数据中,由于,⽤户可能使⽤各种各样的设备,有着各种各样的前端⼊⼝,甚⾄同⼀个⽤户拥有多个设备以及使⽤多种前端⼊⼝,就会导致,⽇志数据中对同⼀个⼈,不同时间段所收集到的⽇志数据中,可能取到的标识个数、种类各不相同;
⽐如:
⽤户可能使⽤各种各样的设备:
1)⼿机、平板电脑
2)安卓⼿机、ios⼿机、winphone⼿机
3)安卓系统有各种版本 ( 5.0 6.0 7.0 8.0 9.0 )
4)ios系统也有各种版本(3.x 4.x 5.x 6.x 7.x … 12.x )
产⽣问题:
⽤户设备的标识,没办法轻易定制⼀个规则来取某个作为唯⼀标识:
mac:⼿机⽹卡物理地址, 若⼲早期版本的ios,winphone,android可取到
imei(⼊⽹许可证序号):安卓系统可取到,若⼲早期版本的ios,winphone可取到,运营商可取到
imsi(⼿机SIM卡序号):安卓系统可取到,若⼲早期版本的ios,winphone可取到,运营商可取到
androidid :安卓系统id
openuuid(app⾃⼰⽣成的序号) :卸载重装app就会变更
idfa(⼴告跟踪码)
deviceid(app⽇志采集埋点开发⼈员⾃⼰定义⼀种逻辑id,可能取⾃android,imei,openudid等):逻辑上的id
从⽽导致:
有⼀些数据中,⽤户有登录账号,⽽有些没有;
南宁旅游景点大全
有⼀些数据中,有imei码,mac地址;⽽有些则有mac地址和android;
前⼀⽇的数据中,有uid,android,⽽后⼀⽇数据中有android,mac地址
在这些情况中,如果按照之前的⽅案来⽣成数据的唯⼀标识,显然错漏百出!
如下图:
要从这些纷繁复杂的各类id中,分辨出哪些id属于同⼀个受众(设备),⽤普通的“where x=y”这种简单条件逻辑很难实现。⼆、id-mapping技术⼿段1:借助redis
可以借助外部存储,⽐如redis,来实现idmapping
1.从⽇志数据中抽取各种标识id
2.将提取出的标识id,去redis标识id库中查询是否存在
3.如果不存在,则新建⼀个"统⼀标识"+“id set”
4.如果已存在,则使⽤已存在的统⼀标识
=== 考虑⼀个很⽆奈的问题 ====
有些数据可能属于同⼀个⼈,但在某个阶段上,这些数据之间没有任何联系,那么这⼈的数据可能会被打上两个不同的标识!      ⼀点点修补措施: 定期对redis的id映射库进⾏整理合并!
但是合并,⼜可能带来另⼀个问题:两个不同的⼈被打上相同唯⼀标识(guid)
三、id-mapping技术⼿段2:借助图计算
采⽤图计算⼿段,来到各种id标识之间的关联关系,从⽽识别出哪些id标识属于同⼀个⼈;
图计算的核⼼思想:
将数据表达成“点”,点和点之间可以通过某种业务含义建⽴“边”
然后,我们就可以从点、边上出各种类型的数据关系:
⽐如连通性;
⽐如最短路径规划;
id_mapping(id打通)的最后⽬标,就是形成⼀个id映射字典:
新还珠格格的插曲
id  ----  guid
idx01 -> gid01
idy01-> gid01
idz01 -> gid01
idx02 -> gid01
idx02,idy2,idz02,idx13  ->  gid02
整体流程:
1.将当⽇数据中的所有⽤户标识字段,及标志字段之间的关联,⽣成点集合 、边集合
2.将上⼀⽇的ids->guid的映射关系,也⽣成点集合、边集合
3.将上⾯两类点集合、边集合合并到⼀起⽣成⼀个图
4.再对上述的图执⾏“最⼤连通⼦图”算法,得到⼀个连通⼦图结果
5.在从结果图中取到哪些id属于同⼀组,并⽣成⼀个唯⼀标识
6.将上⾯步骤⽣成的唯⼀标识去⽐对前⽇的ids->guid映射表(如果⼀个⼈已经存在guid,则沿⽤原来的guid)
四、id-mapping开发实现
1、开发⽬标
将(pc端埋点⽇志、app端埋点⽇志、⼩程序端埋点⽇志)数据中的各种id标识字段提取出来,⽤图计算的连通⼦图算法,求出哪些id标识属于同⼀个⼈;
⽬标结果形式:
id-mapping字典:
gid01 : [imei01 , imei03 ,138******** ,andorid03,mac03 ]
2、整体逻辑
1.抽取3类数据中的各种id字段,映射成“点”集合和“边”集合
2.(可选)过滤掉出现次数低于某个阈值(10次)的“边”
3. 在结合T-1⽇的idmapping字典,构造⼀个图模型
4.求最⼤连通⼦图,得到T⽇的临时结果
5.整理临时结果(去T-1⽇的idmapping中匹配已经存在的gid)以便保持gid的延续性!
gid -> imei01,idfa01,mac01
图计算算法应⽤基本步骤跟前⾯章节⼊门案例基本⼀致
(抽各id,得到⼀个id数据集合,然后再映射出点集合、边集合,再构造图模型,再调连通⼦图算法,取结果加⼯);
3、重点细节问题
有⼀些现实情况需要考虑,⽐如:
1)假如⼀个⼈偶尔⽤他朋友的⼿机登录过⼀次,则会出现他的uid跟他朋友的各设备id之间产⽣关联。
138********,zss,imei000,android000
138********,zss,imei000,android000学硕能考博士吗
138********,zss,imei000,android000
138********,zss,imei000,android000
138********,zss,imei000,android000
138********,zss,imei000,android000
138********,zss,imei002,android002
138********,zss,imei002,android002
怎样备份系统138********,tqq,imei002,android002
138********,tqq,imei002,android002
138********,tqq,imei002,android002
(去掉弱关联,保留强关联)
2)id-mapping计算,需要逐⽇滚动进⾏,这就涉及到T⽇的数据与T-1⽇的id-mapping字典数据之间的合并问题(难在需要将之前⽣成好的“图id”保持⼀贯)。
3)⼀个⽤户的某些id标识,如果持续不再“出现”,应该持续衰减其权重值,权重值低于指定阈值后可以考虑过滤去除(本需求暂时放⼊下期迭代时实现)
4、滚动计算⽅案
day=1:
1)抽取当天各类数据中的id,并映射出“点集合”和“边集合”
2)对“边集合”进⾏聚合计数,过滤掉(频次<;阈值)的边(作⽤:过滤偶然性“噪点”⼲扰)
3)⽤过滤后的边构造图
3)⽤图计算连通⼦图算法,对id标识聚合打通,得到“gid<=>各id标识” id-mapping映射字典
day=2:
1)抽取当天各类数据中的id,并映射出“点集合VertextC1”和“边集合”
2)对当天“边集合”进⾏聚合计数,过滤掉(频次<;阈值)的边,得到“边集合”EdgeC1
3)对T-1⽇的id-mapping结果,重新映射成“点VertextC2、边集合EdgeC2”
4)将上述两个“点、边集合”合并,并构造图
5)对合并图执⾏连通⼦图计算,得到新的id-mapping结果
6)将新id-mapping跟旧的id-mapping进⾏合并操作(可能有新增组,可能有旧组新增id)
(考虑情况:新id新组;新id旧组)
day>=3: 重复day_2的流程
5、实现流程图
主体流程火影之六道佩恩
细节流程
6、代码实现

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。