数仓项目
我们的数仓项目从数据来源来说分为两类,用户行为日志(web端,微信小程序,APP,前端页面埋点)和业务数据库,从技术架构上说,分为ods,dwd,dws,ads层. (1) ODS层是一个数据采集汇聚层,操作的是最原始的数据,主要的任务是:用flume采集第三方日志,和用sqoop进行业务数据库的抽取,要与原始的数据保持一致,采集过来的数据以json格式存储,一般存储的周期为三个月.
(2) DWD层是一个明细层,对ods层的原始数据进行预处理,做ETL处理后的扁平化明细数据,主要的工作是对数据进行清洗过滤:
去除json数据体中的废弃字段(前端开发人员在埋点设计方案变更后遗留的无用字段)2. 过滤掉json格式不正确的脏数据3. 过滤掉日志中account及deviceid全为空的记录(如果是wx日志,过滤account+openid)4. 过滤掉日志中缺少关键字段(properties(事件属性)/eventid(事件id)/sessionid(会话id)的记录!5. 过滤掉日志中不符合时间段的记录(由于app上报日志可能的延迟,有数据延迟到达)6. 对于web端日志,过滤爬虫请求数据(通过useragent(浏览器标识)标识来分析)7. session分割,如果两个时间之间的间隔距离大于30分钟,就切割成两个会话.8. json数据扁平化,properties字段不用扁平化,转成Map类型存储.9. 数据规范处理(骗自己做了)10.维度集成:(1)将日志中的GPS经纬度坐标解析成省市区信息(2)将日志中的IP地址解析成省市区信息(为了方便后续的地域维度分析).注:app日志和wxapp日志,有采集到的用户事件行为时的所在地gps坐标信息,web日志则无法收集到用户的gps坐标,但可以收集到ip地址,gps坐标可以表达精确的地理位置,而ip地址只能表达准确度较低而且精度较低的地理位置.以orc/parquet的形式存储,(Hive对orc这种列式存储更加的支持与稳定)(parquet的兼容性更广一些,Hive和sparksql,impala都支持)一般存储周期为半年. 预处理层有两个技术要点:
1.关联地理维表:
(1)IP地址地理位置解析:加载IP字典库(引入jar包,狮子的魂)将字典中的起始ip和结束ip,都设法转成整数,这样,ip地址段就变成了整数段,将未知区域的ip按照相同方法转换成整数,使用二分查找算法,就能相对方便地查找到字典数据了 (2)GPS地理位置解析:主要用于将日志数据中的经纬度转换成省市区,(引入geohash的包)加载mysql中的gps坐标地理位置字典,将gps坐标转换成geohash编码,调用geohash工具包,传入经纬度,返回geohash码,运用到的技术是地理哈希码,保留到第五位。最后经过关联地理信息维表和关联全局唯一标识后,将数据导入hdfs中,此时数据采集汇聚层任务结束。
2.打上全局唯一标识,新老访客标记,新访客,标记为1,老访客,标记为0
(1)如果用设备id标识,会产生以下问题:可能一个人有多个手机,会被标识成不同的人,如果两个不同的账号在同一台手机登录,会误以为是一个人
(2)关联设备ID和登录ID(一对一),会产生以下问题:一台设备上可能有多个用户使用.设备如果匿名登录,绑定的还是之前的设备,而且一旦绑定,用户就无法再与新设备绑定.
(3)关联设备ID和登录ID(多对一),一个用户在多个设备上登录是一种比较常见的场景,(一个登录ID可以绑定多个设备),会产生以下问题:如用户A绑定了X与Y两个设备,但只使用Y一次,那么Y便无法再与其他用户绑定
(4)最终版:如果仅使用一次的Y设备一直是B账号在使用,此时就要进行动态的调整,要有一个表专门记载(绑定记录表),哪个设备曾经登录过哪个账号,次数,以及设备绑定的GUID,还有打分,绑定设备的记录表要不断的滚动更新,匿名用户就用设备ID当做GUID,如果有两个账号登录一个设备,按照时间戳越早登录的加分越多,历史登录的账号再次登录,就在原有的基础上加分,匿名用户的设备ID如果之前出现过,就还是绑定原有的用户ID,如果之前没有绑定,就在表中添加一个新的设备ID,对应的用户ID为空.
1.加载今日的日志
2.对当天日志中的(设备,账号)组合,进行去重(只取时间最早的一条)
3.在同一个设备上,对不同账号打不同的分(登录时间越早,分数越高)
3.1先将相同设备的数据分组
3.2按时间先后顺序打分(设备号,登录过的所有账号及分数)
4.加载前一日,再绑定记录表,分情况,合并处理
(1)历史表中没有这个设备
(2)今日的表中中没有这个设备(3)历史和今日都有,需要对两边的分数(lst)进行分数合并(需判断是否两边都为空),返回最后的结果(设备ID,登录账号分数,guid)
(3) DWS层做一些轻度聚合,根据主题分析的需求,从dwd层中聚合数据,这层的数据量较少,存储周期为一年.基本上都是根据需求,做了一些中间阶段的轻聚合,比如,我们在统计交互事件的各种报表之前,我们就在dws层先按会话做一个聚合表,按用户组一个聚合表,这样就可以得到每一个会话中各种交互事件的发生次数等结果,得到每一个用户上,各种交互事件的发生次数等结果(流量会话聚合表,流量用户聚合表,日活记录表,历史记录访问表,交互事件分析主题,流量分析主题)
(4) ADS层是根据业务需求,存储从dws计算出来的报表,存储周期为3年,这一层主要就是各种最终报表了.
(5) DIM层存放一些维表,是一个维表层
来源:oschina
链接:https://my.oschina.net/u/4343139/blog/4512637