数仓建设

    科技2022-07-11  115

    数仓建设

    简介

    数据仓库,英文名称为Data Warehouse,可简写为DW或DWH。数据仓库,是为企业所有级别的决策制定过程,提供所有类型数据支持的战略集合。它是单个数据存储,出于分析性报告和决策支持目的而创建。 为需要业务智能的企业,提供指导业务流程改进、监视时间、成本、质量以及控制。

    与数据库的区别

    数据库是面向事务的设计,数据仓库是面向主题设计的。数据库一般服务于业务系统的,数据仓库一般是服务于分析系统的。数据库一般存储在线交易数据,数据仓库存储的一般是历史数据。数据库设计是尽量避免冗余,数据仓库在设计是有意引入冗余。数据库是为捕获数据而设计,数据仓库是为分析数据而设计。数据库一般会对数据进行增删改查,数据仓库一般只对进行增和查,基本不会修改数据。

    现状

    每次需要看公司业绩等各种指标,都单纯从现有的业务系统中去捞取数据,无疑会给系统带来很大的压力,造成大量的资源浪费(业务系统是针对流畅完整的业务流程设计的,并没有考虑统计分析使用)。数据业务知识散乱,数据分析与应用成本高。缺失数据建设规范,数据开发、表结构定义不统一,数据任务、数据表维护人员单一,基本是创建者,成本高。

    数据建模优点

    性能:快速查询数据,减少数据的I/O吞吐(目前公司使用阿里云maxcompute,能感知到的是可以减少任务堵塞)成本:减少数据冗余,计算结果复用效率:减少重复代码,避免一段SQL多层嵌套、逻辑复杂,提高开发效率质量:改善数据统计口径不一致,减少数据计算错误的可能性

    数据分层

    为什么要做数据分层?

    清晰数据结构:每一个数据分层都有它的作用域和职责,在使用表的时候能更方便地定位和理解减少重复开发:规范数据分层,开发一些通用的中间层数据,能够减少极大的重复计算统一数据口径:通过数据分层,提供统一的数据出口,统一对外输出的数据口径复杂问题简单化:将一个复杂的任务分解成多个步骤来完成,每一层解决特定的问题

    数据分层设计

    数据运营层:ODS(Operational Data Store)

    功能: 数据仓库准备区为DWD层提供基础原始数据减少对业务系统影响 方式 离线或者准时接入的数据

    数据仓库层:DW(Data Warehouse) 数据仓库层是我们在做数据仓库时要核心设计的一层,在这里,从 ODS 层中获得的数据按照主题建立各种数据模型。

    数据明细层:DWD(Data Warehouse Detail) 功能: 提供业务系统细节数据的长期沉淀为未来分析类需求的扩展提供历史数据支撑 方式 保持和ODS层粒度一致;指标事实与ODS基本保持一致。剔除异常数据拼接成宽表 数据中间层:DWM(Data WareHouse Middle) 功能: 提供常用维度的初步汇总数据提升公共指标的复用性 方式 对通用的核心指标做聚合,得出相应的统计指标 数据服务层:DWS(Data WareHouse Servce) 功能 集中维度,涵盖较多的业务内容 方式 在DWM的基础上再做二次聚合,保留更少的维度,计算更多的指标提供更多时间维度的数据

    数据应用层:APP(Application)

    功能 对接数据分析需求,提供快速查询、支持 方式 面向业务、面向分析保持数据量小,快速查询、分析

    维表层:DIM(Dimension)

    高基数维度数据:一般是用户资料表、商品资料表类似的资料表。数据量可能是千万级或者上亿级别。低基数维度数据:一般是配置表,比如枚举值对应的中文含义,或者日期维表。数据量可能是个位数或者几千几万。

    规范

    数据建设过程中,从表规范、编码规范来减低模型后续开发、维护成本。

    表规范

    表命名规范如下: (1) 表命名格式:[层次]_[主题]_[表内容]_[统计表规则]_[分区表规则]; (2) 临时表命名格式:[tmp]_[表内容]_[操作者]_[YYYYMMDD];表命名解释如下: (1) 层次:all_(ODS),dwd_(DWD),dwm_(DWM),dws_(DWS), [APP]_(例如apex_), dim_(DIM); (2) 表内容: 表名、视图名总长度不超过64字符;尽量详尽说明表具体内容。 (3) 分区表规则:*_dt (4) 统计表规则:日汇总ds,月汇总ms,日累计da,月累计ma。字段规范: (1) 命名规范 a) 必须使用小写字母,并采用下划线分割; b) 字段名禁止超过 32 个字符; c) 字段名必须见名知意。命名与业务、产品线等相关联; d) 字段名禁止使用 Maxcompute 保留字、Oracle 保留字。

    编码规范

    程序代码:每层一个代码目录,用于存放对应层的模型开发工程。Maxcompute 代码: (1) 使用 left join 代替 in/not in; (2) join 时小表尽量放在左边 (3) 尽量使用静态分区,提升运行效率;例行补数建议使用动态分区简化代码; (4) 慎用笛卡尔积 join,卡历史数据建议使用日期维度表作笛卡尔积,以并行循环操作; (5) 尽量使用窗口函数、udf 简化 sql 逻辑,提升代码可读性; (6) join/group by/distinct 注意处理 NULL 值,尽量避免数据倾斜; (7) union 会去重, 不用去重时使用 union all; (8) 表查询如果是分区表, 加上分区限制。
    Processed: 0.035, SQL: 8