除数字类型的度量值外,事实表总是包含所引用维度表的外键,也可能包含可选的退化维度键或时间戳。数据分析的实质就是基于事实表开展计算和聚合操作。
周期快照事实表中的每行汇总了发生在某一标准周期,如一天、一周或一月的多个度量。其粒度是周期性的时间段。周期快照是在一个给定的时间对事实表进行一段时期的总计。
订单事实表的数据量很大,如果每当需要月销售统计数据时,都从最细粒度的事实表查询,那么性能会很差。
本月处理上月数据。
create tabe dwd.dwd_month_end_sales_order_fact(
order_month_sk string, --日期外键
product_sk int, --产品外键
month_order_amount decimal(10,2), --度量值,月订单金额
month_order_quantity int --度量值,月订单数量
)
clustered by (order_month_sk) into 8 buckets
stored as orc tblproperties ('transactional'='true')
;
累计快照事实表用于定义业务过程开始、结束以及期间的可区分的里程碑事件。通常在此类事实表中针对过程中的关键步骤都包含日期外键,并包含每个步骤的度量值。
比如在电商订单里面,希望跟踪以下5个销售订单的里程碑:下订单、分配库房、打包、配送、收货(用N、A、P、S、R表示)。一个订单完整的生命周期由5行数据描述:
下订单时生成一条销售订单记
订单商品被分配到相应库房时,新增一条记录,存储分配时间和分配数量
产品打包时新增一条记录,存储打包时间和数量
订单配送和订单客户收货时也都分别新增一条记录
1)mysql的订单表sales_order的字段
order_number int,--订单编号,每种状态都会有一条订单记录,这些记录具有相同的订单号
--因此订单号不能再作为主键,因为会重复
customer_number int, --客户编号
product_number int, --产品编号
status_date date, --变为某种状态的日期
order_status, --存储N、A、P、S、R等订单状态之一
--如果一条记录的状态为N,则status_date列是下订单的日期,如果状态是R,status_date列是收货日期
quantity int --某种状态的数量
entry_date date, --登记日期
order_amount decimal(10,2) --销售金额
2)ods.ods_sales_order_fact
order_number int,--订单编号
customer_number int, --客户编号
product_number int, --产品编号
entry_date date, --登记日期
order_amount decimal(10,2) --销售金额
增加下面9列
下单时间
分配库房的日期,
分配库房的数量,
打包的日期,
打包的数量,
配送的日期,
配送的数量,
收货的日期,
收货的数量,
普通事实表中,通常会保存若干维度外键和多个数字型的度量值,度量值是事实表的关键所在,然而无事实的事实表中没有这些度量值,只有多个维度外键。表面上看,无事实的事实表是没有意义的,但在数仓中这类事实表有其特殊用途,无事实的事实表通常用来跟踪事件的发生。
需求:统计每天发布的新产品的数量。创建一张无事实的事实表,通过这张表可以持续跟踪产品发布事件来计算产品的数量。
创建一个事实表,保存有新产品的日期(注意不是所有日期),和其对应的产品
dwd.dwd_product_count_fact
product_sk --产品外键
product_launcj_date_sk --产品发布的日期外键