一、概述

上篇文档 非结构化数仓建模和Schema-Less OLAP构建(零) 我们宏观讲述了如何基于bitmap来作为非结构化建模的底层数据结构,以及在存储、计算和应用方面所带来的好处。那么本节开始将从微观的角度,讲述非结构化数仓具体的建设思路,bitmap数据结构的使用,以及如何搭建Schema-Less OLAP。

由于非结构数仓建模是一套完整的建模体系,区别于当前分层建模的思路。所以本节将结合其中一部分进行讲述,且如何让它在分层数仓建模中起到一个补充优化的作用。

PS:完整的建模思路将在该系列文章最后进行讲述(挖坑)。

二、预聚合层的尴尬

2.1 示例

在分层数仓中,为了便于下游分析,我们一般不会将特别明细的数据暴露给下游使用,通常我们会抽出大宽表「预聚合层」。比如如下用户行为数据(table0):

日期 设备ID 城市 操作系统 其他维度... 访问次数 访问时长 分享次数 其他指标...
2022-01-01 1 北京 Windows ... 1 100 3 ...
2022-01-01 1 上海 Windows ... 1 200 1 ...
2022-01-01 2 北京 Mac ... 1 100 1 ...
...

当然上面的数据已经是「设备」(也可以是其他实体)的粒度了,通常情况下,数据量还是特别大,需要上卷一些维度再进一步做预聚合,比如(table1):

日期 城市 操作系统 其他维度... 设备数 访问次数 访问时长 分享次数 其他指标...
2022-01-01 北京 Windows ... 1 1 100 3 ...
2022-01-01 上海 Windows ... 1 1 200 1 ...
2022-01-01 北京 Mac ... 1 1 100 1 ...
...

或者这样(table2):

日期 城市 其他维度... 设备数 访问次数 访问时长 分享次数 其他指标...
2022-01-01 北京 ... 2 2 200 4 ...
2022-01-01 上海 ... 1 1 200 1 ...
...

2.2 优缺点

这样利用空间换时间的方式,可以让下游按需使用最佳的表来优化计算路径,从而减少计算时间、计算资源,保证数据产出的及时性。

但是这种方式的确定也很明显: