目录

0. 相关文章链接

1. 数据仓库在整个应用中的位置

2. 此次重构的数据仓库具体分层架构

3. 数据仓库为什么要分层

4. 此次重构的数据仓库命名规范

4.1. 表命名

4.2. 表字段类型


0. 相关文章链接

 离线数仓文章汇总 

1. 数据仓库在整个应用中的位置

        数据仓库在企业是处于非常重要的位置;往前接收经由埋点而获取的用户行为日志、拉取商家(报社、博主等内容发布方)和用户交互的业务数据;往后输出的数据可以给领导层提供决策、可以给用户构建画像系统、可以判断用户喜好等。

2. 此次重构的数据仓库具体分层架构

ODS(原始数据层):

  • 用来存储最原始的数据(不对原始数据进行任何操作)
  • 业务数据每天保留一个全量快照
  • 行为日志保留每天新增的日志
  • 使用分区和数据压缩的方式

DWD(明细数据层):

  • 基于原始数据层进行脱敏、ETL、炸裂
  • 行为数据是对ODS层的数据进行分模块处理,保存每天的增量数据
  • 业务数据可以对ODS最新分区做一个保存
  • 业务数据还可以对一些表进行轻聚合

DWM(数据中间层):

  • 基于数据明细层挑选业务线,生成事实表
  • 粒度和数据明细层中选择的主事实表一致,但是只保留当天新增(订单事实)、新增及变化(用户事实)、全量快照(购物车事实)即可

DIM(维度层):

  • 保存维度数据,主要是对业务事实的描述信息,例如何人、何时、何地

DWS(数据服务层):

  • 基于DWD层的事实表和DIM层的维度表进行轻度汇总
  • 一般存放所有主题对象当天的汇总行为(近1天)

DWT(数据主题层):

  • 基于DWS层的轻度汇总表和DIM层的维度表进行累积汇总
  • 一般存放的是所有主题对象的累积行为(近1天、近1周、近1月、近1年)

ADS(数据应用层):

  • 最终结果层,以DWS层、DWT层和DIM层为来源表,根据不同业务进行数据聚集,最终输出报表和数据协助所需要的数据

3. 数据仓库为什么要分层

  • 把复杂问题简单化: 将复杂的任务分解成多层来完成,每一层只处理简单的任务,方便定位问题。
  • 减少重复开发:规范数据分层,通过的中间层数据,能够减少极大的重复计算,增加一次计算结果的复用性。
  • 隔离原始数据:不论是数据的异常还是数据的敏感性,使真实数据与统计数据解耦开。

4. 此次重构的数据仓库命名规范

4.1. 表命名

ODS层命名为ods_表名
DIM层命名为dim_表名
DWD层命名为dwd_表名
DWM层命名为dwm_表名
DWS层命名为dws_表名  
DWT层命名为dwt_表名
ADS层命名为ads_表名
临时表命名为tmp_表名

4.2. 表字段类型

数量类型为bigint
金额类型为decimal(16, 2),表示:16位有效数字,其中小数部分2位
字符串(名字,描述信息等)类型为string
主键外键类型为string
时间戳类型为bigint

4.3. 日期划分

  •  分区的日期格式统一用bigint(不管dt分区【8位】还是ht分区【10位】都能满足)
  • 不管哪一层,昨天的数据统一用昨天的日期,比如因为专场日,需要早晨7点才能跑数,那ods层dwd层数据分区都是用昨天的日期,同时ads层(报表和数据协助历史数据保存)也用昨天的日期;注意:dt才使用这样的规范,ht按当前小时即可

4.4. 环境变量规范

环境变量名

描述

华为云配置

today

今天(8位年月日,yyyyMMdd)

#{DateUtil.format(Job.planTime,"yyyyMMdd")}

one_day_ago

昨天(8位年月日,yyyyMMdd)

#{DateUtil.format(DateUtil.addDays(Job.planTime,-1),"yyyyMMdd")}

two_day_ago

前天(8位年月日,yyyyMMdd)

#{DateUtil.format(DateUtil.addDays(Job.planTime,-2),"yyyyMMdd")}

three_day_ago

大前天(8位年月日,yyyyMMdd)

#{DateUtil.format(DateUtil.addDays(Job.planTime,-3),"yyyyMMdd")}

today_time

今天(14位年月日时分秒,yyyyMMddHHmmss)

#{DateUtil.format(Job.planTime,"yyyyMMddHHmmss")}

one_day_ago_time

昨天(14位年月日时分秒,yyyyMMddHHmmss)

#{DateUtil.format(DateUtil.addDays(Job.planTime,-1),"yyyyMMddHHmmss")}

two_day_ago_time

前天(14位年月日时分秒,yyyyMMddHHmmss)

#{DateUtil.format(DateUtil.addDays(Job.planTime,-2),"yyyyMMddHHmmss")}

three_day_ago_time

大前天(14位年月日时分秒,yyyyMMddHHmmss)

#{DateUtil.format(DateUtil.addDays(Job.planTime,-3),"yyyyMMddHHmmss")}


注:其他 离线数仓 相关文章链接由此进 -> 离线数仓文章汇总


Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐