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


②精确营销
给目标用户群推送优惠的商品提高公司的销售额已经是电商公司采用普遍的精准营销手段 。
但是如何在海量的用户行为日志中第一时间进行人群构建、客群洞察、再到精准地广告投放是有一定难度的 。
如果采用离线计算方案其时效性不能保障 , 可能在这期间就丢失了目标客户 , 在此场景下 , 高效、精确的计算出目标人群尤为重要 。
在引入 RoaringBitmap 后 , 在海量的数据中对受众人群进行全面深入的画像 , 精准投放广告 , 最终帮助企业构建了完整的数字化营销闭环 。
基于 PostgreSQL 实现的 RoaringBitmap
苏宁在对非时序化的海量数据进行分析的场景 , 采用的是分布式 HTAP 数据库 PostgreSQL+Citus 的架构方案 。
我们将 RoaringBitmap 与 Citus 做了整合 , 将 RoaringBitmap 融合进了 Citus 集群 , 而具体的体现就是表中的一个 bitmap 列 , 如下图所示:
|苏宁6亿会员是如何做到快速精确分析的?
本文插图

下面简单介绍下以 PostgreSQL+Citus +RoaringBitmap 的技术架构方案来实现会员新、老买家的场景 。
数据字典
在进行 RoaringBitmap 的存储和计算的之前 , 我们首先要构建一个全局字典表 , 此表就是将要转化的维度维值跟 int 或 long 进行一个映射关系 。
将这个映射关系存储在全局字典表中 , RoaringBitmap 的 32 位和 64 位选择根据实际的数据量进行抉择 。
流程设计
整体的设计流程可分为三步:

  • 模型创建
  • 数据摄入
  • 数据分析

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

数据模型创建流程图
模型创建流程如上图:
①模型的创建、数据初始化、以及查询我们采用的基于 Citus 的存储过程实现方式 , 经测试基于存储过程的方式比常用的 SQL 方式在性能方面有所提升 。
②分片表设计:模型中的元素是有维度、指标、bitmap 组成 , Citus 目前支持三种类型的表 , 分别为本地表、参考表以及分片表 , 分别应用在不同的场景 。
Citus 支持 Hash 和 Append 的方式进行分片 , 以新老买家为例 , 我们以会员的 member_id 进行 Hash 分片 。
分片表设计的不仅解决了 T 级别的数据存储问题 , 也可以根据分片进行并行计算最后再汇总 , 提高计算效率 。
③Cube_bitmap 表的创建是基于模型的 , 在后台我们有收集用户的查询方式 , 根据采集的样本数据我们会根据 Cost 自动的创建 Cube 用于加速 。
④数据分析的数据源我们会根据 Cost 计算从预计算结果、Cube_bitmap 或模型 bitmap 表中获取 。
|苏宁6亿会员是如何做到快速精确分析的?
本文插图

数据摄入流程图
数据摄入流程如上图:
①数据字典同步:全量和增量的模型摄入时候需要同步更新全局字典表 。
②模型 bitmap 表逻辑处理(以会员为例):
第一步:模型表和字典表通过设置的业务主键 Key 进行关联 。
第二步:获取模型增量维度对应的会员 bitmap 数据信息 , 可根据 rb_or_agg(rb_build(ARRAY [b.id :: INT])) 获取。
第三步:将模型 bitmap 表里当天的 (flag=1) 和前一天 (flag=2) 统计的 bitmap 数据进行 rb_or_agg(bitmap) 操作 , 数据整合后作为当天的 flag=2 数据插入到 bitmap 表中 。
第四步:日全量统计表只有 flag+statis_date+bitmap 字段 , 主要统计当天的用户和历史用户 bitmap 情况 , 统计 flag=1 的当天 bitmap 数据 。
模型 bitmap 表与会员表进行关联 bitmap 取 rb_or_agg(rb_build(ARRAY[b.id :: INT])) 。


推荐阅读