公共汇总粒度事实层以分析的主题对象为建模驱动,根据上层应用和产品的指标需求构建公共粒度的汇总指标事实表。每个公共汇总层的表通常最少包含一个派生指标,这些派生指标通过计算和组合基础指标生成,旨在提供更深层次的数据洞察和分析支持。本文为您详细讲解公共汇总事实表的设计原则和表命名规范。
公共汇总事实表设计原则
聚集是指对原始明细数据进行汇总。DWS公共汇总层是面向分析对象的主题聚集建模。在本教程中,最终的分析目标包括:
最近一天某个类目(例如:厨具)商品在各省的销售总额。
该类目
Top 10
销售额商品名称。各省用户购买力分布。
因此,我们可以从最终交易成功的商品、类目、买家等角度对最近一天的数据进行汇总。
聚集是指对原始星型模型的数据进行汇总,而不跨越不同的事实表。聚集的维度和度量必须与原始模型保持一致,以确保查询结果与原始模型一致。
聚集可以显著提升查询性能,但也会增加ETL维护的难度。当子类目对应的一级类目发生变更时,先前已经汇总到聚集表中的数据需要重新调整。
此外,进行DWS层设计时需要遵循以下原则:
数据公用性:在决定是否将汇总的聚集提供给第三方使用时,需要考虑基于某个维度的聚集是否经常用于数据分析。如果这些数据经常用于数据分析,就可以将明细数据汇总并沉淀到聚集表中。
不跨数据域:数据域是在较高层次上对数据进行分类和抽象的集合。通常,数据域按照业务过程进行分类,例如将交易相关的数据归类到交易域下,商品的新增和修改操作则归类到商品域下。
区分统计周期:在表的命名上要能说明数据的统计周期,例如
_1d
表示最近1天,_td
表示截至当天,_nd
表示最近N天。
公共汇总事实表规范
公共汇总事实表命名规范:dws_{业务板块缩写/pub}_{数据域缩写}_{数据粒度缩写}[_{自定义表命名标签缩写}]_{统计时间周期范围缩写}
。
关于统计周期范围的缩写,默认情况下,离线计算应包括最近一天(_1d)、最近N天(_nd)和历史截止当天(_td)三个表,如果
_nd
表的字段过多需要拆分时,只允许以一个统计周期单元作为原子单位进行拆分,例如最近7天(_1w)拆分一个表,不允许一个表存储多个统计周期的数据。对于小时表(无论是天刷新还是小时刷新),都用
_hh
来表示。对于分钟表(无论是天刷新还是小时刷新),都用
_mm
来表示。
具体的表命名可参考以下内容:
示例表名 | 表说明 |
dws_asale_trd_byr_subpay_1d | 买家交易分阶段付款的日汇总表(1日维度)。 |
dws_asale_trd_byr_subpay_td | 买家分阶段付款截至当日汇总表(当日维度)。 |
dws_asale_trd_byr_cod_nd | 买家货到付款交易汇总事实表(多日维度)。 |
dws_asale_itm_slr_td | 卖家商品截至当日存量汇总表(当日维度)。 |
dws_asale_itm_slr_hh | 卖家商品小时汇总表(小时维度)。 |
dws_asale_itm_slr_mm | 卖家商品分钟汇总表(分钟维度)。 |
DWS层数据存储及生命周期管理规范请参见CDM汇总层设计规范。
建表示例
满足业务需求的DWS层建表语句如下。
CREATE TABLE IF NOT EXISTS dws_asale_trd_byr_ord_1d
(
buyer_id BIGINT COMMENT '买家ID',
buyer_nick STRING COMMENT '买家昵称',
mord_prov STRING COMMENT '收货人省份',
cate_id BIGINT COMMENT '商品类目ID',
cate_name STRING COMMENT '商品类目名称',
confirm_paid_amt_sum_1d DOUBLE COMMENT '最近一天订单已经确认收货的金额总和'
)
COMMENT '买家粒度所有交易最近一天汇总事实表'
PARTITIONED BY (ds STRING COMMENT '分区字段YYYYMMDD')
LIFECYCLE 36000;
CREATE TABLE IF NOT EXISTS dws_asale_trd_itm_ord_1d
(
item_id BIGINT COMMENT '商品ID',
item_title STRING COMMENT '商品名称',
cate_id BIGINT COMMENT '商品类目ID',
cate_name STRING COMMENT '商品类目名称',
mord_prov STRING COMMENT '收货人省份',
confirm_paid_amt_sum_1d DOUBLE COMMENT '最近一天订单已经确认收货的金额总和'
)
COMMENT '商品粒度交易最近一天汇总事实表'
PARTITIONED BY (ds STRING COMMENT '分区字段YYYYMMDD')
LIFECYCLE 36000;