假定我们有一个电商的销售数据集,其中包括时间、产品、地区、三个维度以及销售额这个度量数据。其中,各维度表构成如下:
时间维度:时间KEY(time_key)、日期(day)、月(month)、季度(quarter)、年(year)
产品维度:产品KEY(product_key)、产品名称(product_name)、品牌(brand)、产品类别(product_type)
地区维度:地区KEY(location_key)、城市(city)、省(province)、国家(sumry)
事实表构成如下:
事实表: 销售额(sales)、时间KEY(time_key)、产品KEY(product_key)、地区KEY(location_key)
人们很形象的将这种基于维度-事实建模方法得到的数据模型成为星型结构。基于这种结构,我们可以使用SQL分组从不同维度进行数据查询、分析,比如查询2017年每个月份的销售额:
select
t2.month,
sum(t1.sales)
from
sales_fact t1,
time_dim t2
where
t1.time_key = t2.time_key and t2.year = '2017'
group by t2.month
从这个例子中可以看到,在进行查询时需要进行表连接(join)、聚合等比较耗时的操作。为了解决表连接耗时的问题,工程上又提出宽表的方法,也就是接受数据冗余将维度表与事实表合并成一张表,以牺牲空间代价换取时间代价。但是,这仍然没有解决聚合耗时的问题,即使使用spark sql、persto这些新一代的