4.5 离线数仓—DWD层周期快照事实表实现

DWD层购物车周期快照事实表设计与实现
本文介绍了数据仓库DWD层中周期快照事实表的概念,特别是针对交易域购物车的快照表设计。通过构建此类表,可以简化统计每个用户购物车商品库存的复杂性,避免对事务型事实表的大量聚合操作。文章详细讨论了建表原因、建表语句和数据装载过程,并举例说明了周期快照事实表在解决特定业务需求时的优势。

前言

前面完成了所有事务型事实表的设计,下面进行DWD层唯一一张周期型快照事实表的设计。

一、周期型快照事实表回顾

1.周期型快照事实表概述

       周期快照事实表以具有规律性的、可预见的时间间隔来记录事实(记录的不是明细数据),主要用于分析一些存量型(例如商品库存,账户余额)或者状态型(空气温度,行驶速度)指标。
       对于商品库存、账户余额这些存量型指标,业务系统中通常就会计算并保存最新结果,所以定期同步一份全量数据到数据仓库,构建周期型快照事实表,就能轻松应对此类统计需求,而无需再对事务型事实表中大量的历史记录进行聚合了。
      对于空气温度、行驶速度这些状态型指标,由于它们的值往往是连续的,我们无法捕获其变动的原子事务操作,所以无法使用事务型事实表统计此类需求。而只能定期对其进行采样,构建周期型快照事实表。
       使用场景:对于需要大量数据聚合得出结果的数据,而业务数据库中会保存最新结果的数据,可以采用周期快照事实表。

二、交易域购物车周期快照事实表

1.建表原因

这里是因为后面的需求导致需要统计每个用户购物车中每个商品的库存量。
在ODS层中有一张购物车的增量表也有一张购物车的全量表,这里可以解释出原因:如果只有一张购物车的增量表,如果要统计截至当天每个用户每个商品的库存量,需要查找多个分区的数据,比较麻烦。所以在ODS层有一张购物车的全量表,方便这里周期快照事实表的使用。

2.建表语句

DROP TABLE IF EXISTS dwd_trade_cart_full;
CREATE EXTERNAL TABLE dwd_trade_cart_full
(
    `id`       STRING COMMENT '编号',
    `user_id`  STRING COMMENT '用户id',
    `sku_id`   STRING COMMENT '商品id',
    `sku_name` STRING COMMENT '商品名称',
    `sku_num`  BIGINT COMMENT '加购物车件数'
) COMMENT '交易域购物车周期快照事实表'
    PARTITIONED BY (`dt` STRING)
    ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t'
    STORED AS ORC
    LOCATION '/warehouse/gmall/dwd/dwd_trade_cart_full/'
    TBLPROPERTIES ('orc.compress' = 'snappy');

3.数据装载语句

这里首日数据装载和每日数据装载都一样,因为是从ODS层的购物车全量表拿的当天的数据。

insert overwrite table dwd_trade_cart_full partition(dt='2020-06-14')
select
    id,
    user_id,
    sku_id,
    sku_name,
    sku_num
from ods_cart_info_full
where dt='2020-06-14'
and is_ordered='0';

装载语句说明:
业务系统中在提交订单后,正常情况下购物车里的数据要消失,这里没有消失,而是用一个字段进行了标记,所以要通过根据字段的值判断是否还在购物车里。

例如有如下需求:
在这里插入图片描述
如果要算这个需求,不建立购物车周期快照事实表,那就需要加购物车事务事实表和减购物车事务事实表这两张表去算,还要进行join,很麻烦。如果建立了购物车周期快照事实表,可以直接去算,很方便。

### 离线数据仓库 DWD 的作用及功能介绍 #### 1. 数据清洗与结构化 DWD(Data Warehouse Detail)是离线数据仓库中承上启下的重要次,其主要作用是对 ODS(Operational Data Store)中的原始数据进行清洗、转换和结构化处理[^1]。通过去除无效数据、修正错误数据以及补充缺失字段,DWD 能够为后续的数据分析提供高质量的基础数据支持。 #### 2. 数据去重与一致性保证 在数据装载过程中,DWD 会确保数据的一致性和完整性。例如,在购物车周期快照事实表实现中,通过过滤条件 `is_ordered='0'` 和指定日期分区 `dt='2020-06-14'`,可以有效避免重复数据的加载,并保持数据的时间维度一致性。 #### 3. 数据分区与存储优化 为了提高查询效率和降低存储成本,DWD 通常会对数据进行分区管理,例如按照日期字段 `dt` 进行分区。此外,DWD 还会采用压缩技术(如 LZO 压缩算法)来减少存储空间占用,同时保持较高的查询性能[^2]。 #### 4. 数据模规范化 DWD 的设计遵循严格的数据建模规范,旨在为后续的 DWS(Data Warehouse Summary)和 ADS(Application Data Service)提供清晰、一致的数据结构[^2]。例如,在流量域页面浏览事务事实表实现中,DWD 会定义详细的建表语句,并明确各字段的含义和用途[^3]。 #### 5. 数据生命周期管理 DWD 的数据通常具有较长的生命周期,可能保留多年甚至永久保存。这种设计是为了满足历史数据分析的需求,同时也便于追溯数据来源和变化过程。 #### 6. 支持多维度分析 DWD 通过对不同业务域(如交易域、流量域等)的事实表进行建模,能够为多维度分析提供丰富的数据支持。例如,流量域中的页面浏览、启动、动作、曝光和错误等事务事实表分别记录了用户行为的不同方面,从而为精细化运营提供了数据基础[^3]。 ```sql -- 示例:DWD 数据装载语句 insert overwrite table dwd_trade_cart_full partition(dt='2020-06-14') select id, user_id, sku_id, sku_name, sku_num from ods_cart_info_full where dt='2020-06-14' and is_ordered='0'; ``` --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值