1 什么是数仓

数仓是为企业所有决策制定过程,提供所有系统数据支持的战略集合。通过对数据仓库中数据的分析,可以帮助企业改进业务流程、控制成本、提高产品质量等。数据仓库并不是数据的最终目的地,而是为数据最终的目的地做好准备。这些准备包括对数据的清洗、转义、分类、重组、合并、拆分、统计等。

数仓的:

  • 输入系统,埋点产生的用户行为数据、JavaEE 后台产生的业务数据、爬虫数据
  • 输出系统,报表系统、用户画像系统、风控系统、推荐系统、机器学习等

2 数仓分层

2.1 ODS(Operation Data Store)原始数据层

存放未经过处理的原始数据,结构上与源系统保持一致,是数据仓库的数据准备区。

ODS表命名规范:ods_表名_单分区增量全量标识(inc/full)

主要是存储近期的原始事务数据,以便进一步的处理和分析。

  1. 保持数据原貌,不做任何修改:ODS数据通常是未经处理的原始数据,直接从源系统导入,保留数据的原始状态,包括所有历史记录和细节,以便数据审计和完整性分析。
  2. 压缩采用 LZO,压缩比是 100g 数据压缩完 10g 左右:为减少存储空间和优化I/O性能。LZO是一种可以提高数据读取速度的压缩算法,在Hadoop生态系统中使用较广。虽然10:1压缩比例是一个大概的参考,实际的压缩比率会根据数据的类型和特性而有所不同。
  3. 创建分区表:在数据仓库中创建分区表是为了优化查询性能。通过将表中的数据分为较小的部分(分区),可以减少查询时需要扫描的数据量,特别是在大量数据的环境中,分区可以显著提高性能。

ODS的设计确实是为了确保数据可以迅速被引入数据仓库系统,并为之后的ETL(Extract, Transform, Load)操作、数据清洗、维度建模以及事实表的生成做准备。在维护数据的准确性和一致性的同时,也要考虑存储和查询性能的优化。

具体工作

比如就是利用 Hive 去映射 HDFS 中的数据,将其制作成表。

2.2 DWD(Data Warehouse Detail) 明细数据层

也称为数据清洗层或数据准备层,主要负责对ODS层中的原始数据进行清洗和转换,使数据更加适合于分析。基于维度建模理论进行构建,存放维度模型中的事实表,保存各业务过程最小粒度的操作记录。各指标都在该层。

  1. 数据清洗
  • 空值去除:清除那些空值记录,保证数据的完整性。
  • 过滤无意义的数据:比如,去掉订单ID、支付ID为空的记录,确保核心业务字段的准确性。
  • 数据一致性处理:对用户行为宽表和业务表进行匹配和整合,保证数据在各表之间的一致性。
  1. 清洗的手段
  • 使用 SQL 进行结构化数据查询和清洗。
  • MapReduce(MR)、Resilient Distributed Dataset(RDD)等大数据处理技术用于处理大规模数据集。
  • Kettle、Python 等工具可进行数据转换、迁移和清洗。
  1. 清洗数据量的合理范围
  • 清洗数据的比例取决于数据质量和业务要求,通常没有固定的标准。在某些情况下,例如1万条数据中清洗掉1条可能是合理的,但这需要根据实际情况分析。
  1. 数据脱敏
  • 对敏感数据,如手机号、身份证号等信息进行脱敏处理,以保护用户隐私。
  1. 维度退化
  • 简化数据模型,减少复杂的多维结构,例如将商品分类合并成一个字段,或将省市县地址合并,以提升查询效率和简化分析过程。
  1. LZO压缩
  • 对数据进行LZO压缩,以节省存储空间并优化读取性能。
  1. 列式存储 Parquet
  • 利用列式存储格式如Parquet,可以优化分析查询的性能,特别是对于只需要访问表的某几列数据的场景。

综上,DWD目标是确保数据在质量、安全性、效率和可用性方面都满足数据仓库和业务分析的需求。通过DWD层的处理,数据将被准备好供下一层(数据应用层、数据分析层等)使用。

2.3 DIM(Dimension)公共维度层

基于维度建模理论进行构建,存放维度模型中的维度表保存一致性维度信息

2.4 DWS(Data Warehouse Summary )汇总数据层

基于上层的指标需求,以分析的主题对象作为建模驱动,构建公共统计粒度的汇总表。读取业务主题明细表,计算出各业务主题关心的通用维度和指标,并存储到自研的wtable(分布式KV、klist 存储系统 )

2.5 ADS(Application Data Service)数据应用层

存放各项统计指标结果。提供 ad-hoc 查询和实时大盘服务,ad-hoc查询指通过 Flink 将主题明细宽表实时导入ck,为分析师和产品提供 ad-hoc 查询;实时大盘主要读取 wtable 中存储的DWS多维汇总指标来提供。

2.6 DWT(主题数据层,可有可无)

做了哪些事。既然可有可无,就不要它,将其也放入 DWS。