为了能支持到更加丰富的场景以及支持到实时离线联邦查询下机动的窗口应用,我们方案的考虑方向转向为不再做指标的预盘算,直接将明细数据写入到OLAP引擎,在数据集/数据服务等服务层直接关联DIM表即席查询。同样这对OLAP引擎的性能要求极高,CCO在客岁实时架构升级之后,参见CCO x Hologres:实时数仓高可用架构再次升级,双11大规模落地,借助Hologres列存强大的OLAP能力及实时离线联邦查询能力使该方案落地变为大概。
没有最好的方案,只有在对应场景下做出取舍后相对实用的方案。在这个阶段,我们捐躯了一定的查询性能,选择了对场景支持更丰富、实时离线联邦查询以及扩展机动度更支持更佳的方案。当然在淘系这类较大数据量的业务场景中,我们也做了一定的优化和取舍。如在实际处置惩罚中,对于相对稳固的维度我们在MaxCompute/Flink处置惩罚写入了明细,只对于行业类目等这类易调整且相对敏感的维度直接在数据集/数据服务关联查询。
三种方案对比:
serv_ids AS ( SELECT serv_id FROM ads_xxx_crm_serv_total_chl_di WHERE date_id = '${bizdate}' GROUP BY serv_id )
,new_serv_ids AS ( SELECT a.serv_id FROM serv_ids a LEFT JOIN serv_id_mapping b ON (a.serv_id = b.serv_id) WHERE b.serv_id IS NULL )
INSERT INTO serv_id_mapping SELECT serv_id
FROM new_serv_ids
;
------按照聚合条件聚合后插入roaringbitmap聚合结果表
WITH
aggregation_src AS( SELECT date_id,bu_type, industry_name,cate_level1_name,cate_level2_name, cate_level3_name, serv_id_int32 FROM ads_xxx_crm_serv_total_chl_di a INNER JOIN serv_id_mapping b ON a.serv_id = b.serv_id WHERE a.date_id = '${bizdate}' )
INSERT INTO ads_tb_roaringbitmap_agg
SELECT date_id
,bu_type
, industry_name
,cate_level1_name
,cate_level2_name
,cate_level3_name
,RB_BUILD_AGG(serv_id_int32)
FROM aggregation_src
where cate_level3_name is not null
and bu_type is not null
GROUP BY date_id
,bu_type
, industry_name
,cate_level1_name
,cate_level2_name
,cate_level3_name
;
-------执行查询,RB_CARDINALITY 和 RB_OR_AGG 聚合计算
SELECT bu_type
, industry_name
,cate_level1_name
,cate_level2_name
,cate_level3_name
,RB_CARDINALITY(RB_OR_AGG(serv_id32_bitmap)) AS serv_cnt ---去重计算结果字段