我们在计算留存指标(次留、3留、7留、15留、30留)的时候,通常情况下会使用以下公式:
第N日留存率公式 = (T日访问用户)∩ (T+N日访问用户) / (T日访问用户),这种实现方式,具有很好的代码可维护性和可读性,但是逻辑代码比较臃肿,对于数据量比较大的场景,每次计算都要刷一次数据,效率比较低。其实,我们可以转变思路,通过构造Bitmap来实现留存的指标,通过每一个bit位代表每一天的访问,最低位代表今天,比如:0001 就代表最近4天只有今天来访,0101 就代表最近4天有2天来访问,分别是今天和前天。使用位图方法可以显著提高数据查询的效率,特别是在处理大数据集时,这种方法比传统的交集查询更加节省空间和时间。通过本文,你可以了解到:
感谢关注,希望本文对你有所帮助。
什么是Bitmap
Bitmap,又称位图索引,是一种用于快速定位、检索和管理数据状态的数据结构,特别适合于处理具有两种状态(如是/否、存在/缺失)的大量数据集。在Bitmap中,每个数据元素用一个二进制位来表示,其中位的值通常是0或1。举个栗子:访问留存指标计算
假设我们想要跟踪用户的访问留存情况。使用Bitmap来记录用户连续7天内的访问情况。
为了表示用户每天是否访问应用程序,我们使用一个7位的Bitmap,每一位代表一天。如果用户在某一天访问了应用,相应的位设为1,否则设为0。
让我们以一个具体的用户为例,记录他们一周内的访问情况:
对应的Bitmap如下:
在计算机中表示为二进制数为:1011001
如何构建Bitmap实现留存指标计算
数据准备
构建Bitmap表
通过上述逻辑,我们可以根据用户每日的成交情况,构建出用户最近31天的成交bitmap,并将二进制的bitmap转换成十进制进行存储,31的bitmap具体如下:
123qwe:0111 1111 1111 1111 1111 1111 1111 1111对应的十进制数:2147483647
456qwe:0111 1111 1111 1100 0000 0000 0000 0000对应的十进制数:2147221504
789qwe:0100 0000 0000 0000 0000 0011 1111 1111对应的十进制数:1073742847
120qwe:0100 0000 0000 0111 1111 1110 0000 0000对应的十进制数:1074265600

实际存储的是该二进制对应的十进制。对应的20240131那天的分区数据,存储的内容如下:
以此类推,每个分区存储的都是近31天的用户成交bitmap。
SHIFTLEFT:
按位左移(<<)1010,左移一位之后变成:10100,对应的值是20左移一位之后变成:左移一位之后变成:
通过这个函数,即可实现每天滚动记录用户的成交情况比特位,上述逻辑中,对bitmap做了上限控制 trd_31d&(pow(2,N)-1) 防止溢出。2147483647=pow(2,31)-1表示最近31天的数据。即能保障该值能存储的最大值为2147483647,即表示31天都有成交。
留存指标计算
次日留存
次日留存,首先计算分母,即20240115当天的成交用户数:
由于trd_31d二进制表示的最近31天的成交情况。(以十进制存储的二进制,最右侧是最新),那16号那天的数据为:
trd_31d & 2 = 2,2对应的二进制为:0010,也即是与二进制0010进行与运算,得到的结果等于2,即统计的是20240115号对应的bit位为1的人数,即20240115成交的用户数
上述代码trd_31d & 3 = 3,3对应的二进制为:0011,也即是与二进制0011进行与运算,得到的结果等于3,即统计的是20240116和20240115对应的bit位都为1的人数,即20240115成交且20240116有成交的用户数
第7日留存
上面给出了次日留存的逻辑,那第7日留存该如何计算了,其中是有规律的。先看下第7日留的公式:
trd_31d进行与运算,这个数就是128,为什么是128呢?我们来看下128=pow(2,7)对应的二进制:1000 0000,进行与运算,这个数就是128,为什么是128呢?我们来看下128=pow(2,7)对应的二进制:进行与运算,这个数就是128,为什么是128呢?我们来看下128=pow(2,7)对应的二进制:20240131为例,用20240131对应的bit位和****1000 0000表示20240124号有成交的用户,即:
进行与运算得到结果129即可:
综上:
总结:计算第N留存的分子分母,需要将bitmap分别跟pow(2,N) + 1,pow(2,N) 进行与运算即可。
简化形式
成交天数计算
计算每个用户最近7天的成交天数
上述代码中,BITMAP_COUNT为自定义函数,由于是取最近7天的成交天数,也就是说统计最近7个bit位为1的个数,所以最大值为:0111 1111,所以与127求与运算之后,返回的最大值就是127
关于自定义函数,其逻辑如下:即判断当前数与1进行与运算,如果返回1,则表示该bit位为1,然后向右移一位,重复上述步骤,直至统计出所有为1的bit位个数。
总结
本文主要基于Bitmap实现留存指标和成交天数指标计算,在大数据量情况下,由于对数据进行了压缩,所以处理效率相对较高。
–END–









暂无评论内容