• 离线数仓(2):数据仓库相关架构和规范


    目录

    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. 表命名

    1. ODS层命名为ods_表名
    2. DIM层命名为dim_表名
    3. DWD层命名为dwd_表名
    4. DWM层命名为dwm_表名
    5. DWS层命名为dws_表名
    6. DWT层命名为dwt_表名
    7. ADS层命名为ads_表名
    8. 临时表命名为tmp_表名

    4.2. 表字段类型

    1. 数量类型为bigint
    2. 金额类型为decimal(16, 2),表示:16位有效数字,其中小数部分2
    3. 字符串(名字,描述信息等)类型为string
    4. 主键外键类型为string
    5. 时间戳类型为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")}


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


  • 相关阅读:
    入门Rabbitmq
    Java JVM虚拟机
    微擎模块 酷炫小程序相册V4.4开源版,新增广告+评论功能相册点赞功能
    Apache POI实现Excel导入读取数据和写入数据并导出
    VSCode 居然是个娱乐软件?让你 high 到爆的几款插件
    使用nodejs通过vpn途径去下载图片(如果你自己写了爬虫可以用以下去弄ip池那些)
    幻兽帕鲁服务器多少钱?有买过的吗?
    《C++ primer plus》精炼(OOP部分)——对象和类(7)
    springboot前端如何传参后端如何优雅的接收的参数
    使用 Apache Camel 和 Quarkus 的微服务(二)
  • 原文地址:https://blog.csdn.net/yang_shibiao/article/details/126613856