数仓开发新模式:物化视图与逻辑数据集的应用
计算复杂度低。CUBE计算本质上需要将数据复制n份(依据CUBE个数),然后进行聚合操作,如果CUBE众多,那么中间的数据膨胀会相当严重,甚至会引发执行超时和报错。而物化视图本质上是对宽表的聚合,所以不存在中间数据膨胀,执行性能会更好。 通用性高。CUBE表一般属于APP表,和BI宽表数据集本身没有绑定关系,那么这个CUBE表很可能只能服务于特定的看板,当有另外的看板在用到类似的维度分析时,如果没有数仓工程师凭借丰富经验做推荐,大概率不会复用该APP表。而物化视图本身是绑定到数据集的,所以只要可以命中物化视图的查询格式,那么不论查询来自哪里,都可以进行复用。
节点与节点之间是 LEFT-JOIN 连接 右表关联键不存在重复值
需要物化的内容。在我们的场景下,就是看板和自主分析模版。看板和自主分析模版的查询热度作为辅助指标可以使用户知晓哪些看板的物化更有价值。 调试过程。用户不大可能一次性就可以创建出没有任何问题的物化视图,物化视图要想发挥价值,必然需要保证性能和命中率两个方面。
LodQuery抽象
RedBI抽象的 LodQuery 大致包括以下部分:
• dimensions:查询维度,指定了需要查询的聚合粒度
• measures:查询度量,指定了在聚合粒度为 dimensions 时需要查询的度量字段
• from:查询表信息,指定了多张原始表、自定义SQL表、逻辑数据集对应的主表和多张维表的定义及关联方式,存在嵌套结构。
•dimensionFilters:维度筛选,指定了对明细数据的筛选方式,需要指定Pill和FilterPredicate
• measureFilters:度量筛选,指定了对聚合后数据的筛选方式,需要指定Pill和FilterPredicate
• orderBy:排序,指定了查询需要按哪些字段进行排序
• offset:查询偏移量,指定了结果需要偏移多少行数据
•limit:查询数据量,指定了结果集的数据量上限
基于数据集物化配置获取对应物化视图列表,并根据优先级排序进行物化命中的校验。 命中物化则将 LodQuery 改写为物化查询的 MaterializedQuery。 对 MaterializedQuery 进一步优化,包括谓词下推、开窗函数处理,引擎特定函数处理等,转换为为 TableQuery(抽象语法树)。
选择基于 LodQuery 而非 TableQuery 进行物化改写的原因在于虽然 TableQuery 和 LodQuery 结构大体一致,但 LodQuery 作为 RedBI 的抽象,具有更丰富的元信息。例如LodQuery 将维度(dimensions)和度量(measures)明确分离,而TableQuery则不区分 dimensions 和 measures。此外,在 LodQuery 转换为 TableQuery 之前,尚未进行各项查询优化,例如谓词下推、窗口函数处理、引擎特定函数处理等,数据结构更加精简,这为物化改写提供了更大的灵活性和可操作空间。
基于 TableQuery 生成SQL, 发送到 StarRocks 进行数据查询,并返回数据。
业务实体 id:比如用户 id、商家 id、商品 id等。每个业务都有核心分析的业务实体,我们针对这类实体id建立了对应的编码表,编码表可以将字符串id映射为紧凑的数字id。大部分的 UV 指标可以通过这类字段进行计算。 自定义消重字段:这类字段通常是通过维度+实体 id 拼接而成,比如搜索 id+搜索词+用户,这类字段的基数很大,也很灵活,很难用固定的编码表进行映射。对于这种类型的字段,我们现在只能通过特定的sql改写来解决,本文不做详细讨论。
增加物化视图的数据条数,从而增加查询并发。 降低BITMAP的倾斜程度。