|苏宁6亿会员是如何做到快速精确分析的?( 三 )


第五步:日全量统计表统计 flag=2 的当天 bitmap 数据 , 从自身表中获取当天 flag=1 和昨天统计的 flag=2 的数据然后做 rb_or_agg(bitmap) 。
③Cube_bitmap、预聚合结果表的源来自于数据模型表 , 在此基础上做加速处理 。
|苏宁6亿会员是如何做到快速精确分析的?
本文插图

数据查询流程图
【|苏宁6亿会员是如何做到快速精确分析的?】数据分析如上图:
①根据要查询的维度进行 Cost 分析判断 , 最终路由到预计算结果表、Cube_bitmap 表、模型表进行数据分析 。
②从模型 bitmap 表或 cube_bitmap 表获取 bitmap_cur 和 bitmap_sum , 从全量 bitmap 表中获取 bitmap_all 数据(flag=2 并且日期是查询日期的前一天) 。
后续的 bitmap 位运算可在 bitmap_cur、bitmap_sum 和 bitmap_all 中进行 。
应用举例
①业务场景
业务场景如下图:
|苏宁6亿会员是如何做到快速精确分析的?
本文插图

|苏宁6亿会员是如何做到快速精确分析的?
本文插图

②设计方案
第一步:将买家的 ID 作为数据字典的信息 , 与对应的 int 或 long 形成关系映射存入全局字典表 。
第二步:统计每天的线上、线下的新老买家 , 统计维度根据渠道(线上和线下)+tag(1 当天 2 历史)+日期 。
每天有两条统计信息 , 一个是当天的用户买家 bitmap 集合 , 一个是历史的用户买家 bitmap 集合 。
第二天统计基于第一天统计的集合和当天的集合做 rb_or_agg , 形成一个新的当天历史 bitmap 集合(结果存储在 Bitmap_Table_A) 。
第三步:基于统计维度(品类+渠道)+tag+日期来统计新老买家情况 , 每天也会有两条统计信息 , 一个是当天的一个是历史的 , 当天统计的是所有的品类和渠道做的 group by 统计 , 统计 bitmap 集合打上标签为 flag=1 , 历史 flag=2 是基于前一天历史加上当天统计的集合做 rb_or_agg , 形成一个新的当天历史 bitmap 集合(结果存储在 Bitmap_Table_B) 。
③场景分析
场景一:0428 线上新买家
|苏宁6亿会员是如何做到快速精确分析的?
本文插图

统计 0428 线上新买家实则就是 bitmap 集合 {A , D} 和 bitmap 集合 {A , C} 进行 rb_andnot_cardinality 位运算 , 结果为 {D} , 新买家的数量为 1 。
场景二:0428 线上空调新买家
|苏宁6亿会员是如何做到快速精确分析的?
本文插图

统计 0428 线上空调新买家则就是 bitmap 集合 {C, A} 和 bitmap 集合 {C} 进行 rb_andnot_cardinality 位运算 , 结果为 {A} , 新买家的数量为 1 。
0428 线上冰洗新买家则是 bitmap 集合 {D} 和 bitmap 空集合做 rb_andnot_cardinality 位运算 , 结果为 {D} , 数量为 1 。
场景三:0428 线上空调新买家中有多少是线上新买家
统计则根据和 Bitmap_Table_A 和 Bitmap_Table_B 做 rb_and_cardinality 操作 , 则拿 bitmap 集合 {A} 和 bitmap 集合 {{A , C}} 进行 rb_andnot_cardinality 位运算 , 结果为空集 , 数量为 0 。
0428 线上冰洗新买家则根据 bitmap 集合 {D} 和 bitmap 集合 {A , C} 进行 rb_andnot_cardinality 位运算 , 运算结果 bitmap 集合为 {D} , 数量为 1 。
0428 线上新买家品类分布即为:基于 Bitmap_Table_B 表 , 0428 线上品类有冰洗 {D} 和空调 {A} , 基于 Bitmap_Table_A 表统计线上历史买家为 {A , C} 。
线上新买家冰洗则拿 {D} 和 {A , C} 做 rb_andnot_cardinality 后的集合为 {D} , 数量为 1 。


推荐阅读