bitmap实践-留存计算

目录

  • 1. 介绍
  • 2. 留存问题
  • 3. 思路解析
  • 4. 逻辑
    • 4.1 b表建设
    • 4.2 留存计算
    • 4.3 近X天的访问天数
  • 5.分析

1. 介绍

bitmap方法是数据压缩使用的常用算法,当字段有明确上下界的时候,使用位图模式来减少存储。在业务指标体系中特别适合通用型留存指标的计算。

2. 留存问题

我们常写的留存率指标:次留/3留/7留/15留/30留,实际上都是一个公式:

第N日留存率公式 = (T日访问用户)∩ (T+N日访问用户) / (T日访问用户)

那么一般情况下,我们怎么写呢:
select user_id from 访问表 where ds=T 交集
select user_id from 访问表 where ds=T+N 除以
select user_id from 访问表 where ds=T

设计也很简单,每一个bit位代表每一天的访问,最低位代表今天;
比如 0001 就代表最近4天只有今天来访,0101 就代表最近4天有2天来访问,分别是今天和前天

bitmap访问分布 = sum(今日访问 UNION ALL 左移位(昨日访问表))
特别注意:对bitmap做了上限控制,vst_bit_31d&(pow(2,N)-1) 防止溢出。2147483647=pow(2,31)-1表示最近31天的数据

3. 思路解析

在这里插入图片描述

  1. 通常我们计算次日留存,按照正向思考是当天来访的设备,在后面1天是否来访。也就是(ds = T ) 交集 (ds = T+1)
  2. 但是在写代码的时候,我们通常都是逆向的,是找过去第1天的设备,到现在是否来访。 也就是(ds = T-1) 交集 (ds = T)
  3. 比如今天是20231117,底层odps产出的是20231116的分区,但是20231115的次留才能计算
  4. 我们需要一张B表中的一个字段标识是否访问,由上文所说比如 0001 就代表最近4天只有今天来访,0101 就代表最近4天有2天来访问,分别是今天和前天
  5. 比如该用户在20231116 来了,且20231115也来了,那么这个b表在20231115日分区的这个字段的十进制为1 二进制为(01)2;在20231116日分区的这个字段的十进制为3 二进制为(11)2,那么如何计算20231115的留存呢?
  6. 我们将20231116分区这个字段 & (10)2 = pow(2,1) 就能判断该设备是否昨天来访;& (11)2 = pow(2,1)+1就能判断他是否昨天今天都来了
  7. 计算其他留存只是&的字段不同,如果计算当日访问的设备,在第7天是否来访,K1 = (10000001)2 = pow(2,7)+1 ,K2 = (10000000)2 = pow(2,7)

select user_id from B WHERE ds = T and vst_bit_31d & K1 = K1 	-- 当日和7日前来访
交集
select user_id from B WHERE ds = T and vst_bit_31d & K2 = K2	-- 7日前来访
除以
select user_id from B WHERE ds = T and vst_bit_31d & K2 = K2	-- 7日前来访
  1. 如果计算当日访问的设备,在后7天内是否来访,K1 = (11111111)2 = pow(2,8)-1 ,K2 = (10000000)2 = pow(2,7)
select user_id from B WHERE ds = T and vst_bit_31d & K1 > K2 -- 7日前来访 且后面7日中有一天来访就算
交集
select user_id from B WHERE ds = T and vst_bit_31d & K2 = K2
除以
select user_id from B WHERE ds = T and vst_bit_31d & K2 = K2

4. 逻辑

4.1 b表建设

select product_id        -- 业务id
     , visitor_id        -- 访问者id
     , sum(vst_bit_31d)  -- 最近31天的访问bitmap
FROM
(
  -- 昨日分区bit左移1位
  SELECT  product_id
         ,visitor_id
         ,IF(vst_bit_31d > 0, SHIFTLEFT(vst_bit_31d, 1)&2147483647, 0 ) as vst_bit_31d
  FROM   ${your_bitmap_table_name}      -- Bitmap表
  WHERE   ds = '${sub1d}'
  
  UNION ALL
  
  -- 今日访问bit=1
  SELECT   product_id
          ,visitor_id
          ,1 
  FROM    ${your_visit_table_name}     -- 访问表
  WHERE   ds = '${bizdate}'
  group by product_id, visitor_id
) 
GROUP by product_id, visitor_id

4.2 留存计算

需要注意的是product_id 为最细粒度,不可跨粒度计算


@vst_bit_2 :=
SELECT  product_id, count(visitor_id) as uv
FROM    ${your_bitmap_table_name}      -- Bitmap表
WHERE   ds = '${bizdate}'
AND     vst_bit_31d & 2 = 2            -- 昨日访问UV, 分母
AND    ( '${your condition}' )
GROUP BY product_id
;

@vst_bit_3 :=
SELECT  product_id, count(visitor_id) as uv
FROM    ${your_bitmap_table_name}      -- Bitmap表
WHERE   ds = '${bizdate}'
AND     vst_bit_31d & 3 = 3            -- 昨日留存UV, 分子
AND    ( '${your condition}' )
GROUP BY product_id
;

-- 计算次留率
select product_id, min(uv)/max(uv) 次留率
(
select * FROM @vst_bit_3 
UNION ALL
select * FROM @vst_bit_2
)
group by product_id;

4.3 近X天的访问天数

-- 最近7天内的访问天数,其中127=pow(2,7)-1=127
SELECT  product_id
       , visitor_id
       , bi_udf:bi_bit_count(vst_bit_31d&127, 1) AS vst_days
FROM    ${your_bitmap_table_name}      -- Bitmap表
WHERE   ds = '${bizdate}'
AND    ( '${your condition}' )
GROUP BY product_id, visitor_id, bi_udf:bi_bit_count(vst_bit_31d&127, 1)

;

5.分析

● bitmap的使用确实可以加速数据的运算,每天存储的是之前30天是否来访,
● 如果想看过去60天的,也方便进行扩展
○ 可拿ds-30的分区数据,拿到过去30-60天的访问数据
○ 或者把这个vst_bit_31d变成longlong类型
● 但是使用时需要注意,这个建立B表的时候,维度一定要确定不能组合,比较死板
● 新建表后需要按时间顺序回刷

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/168353.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

RAID技术复习笔记

Raid(Redundant Array of independent Disks)独立磁盘冗余阵列:磁盘阵列 Raid 分为:软raid、硬raid、软硬混合三种。 软Raid:所有的功能均有操作系统和CPU来完成,没有独立的raid控制、处理芯片和IO处理处理芯片。 硬R…

如何从零开始制作一本企业宣传画册?

最近公司领导要求为公司制作一本企业宣传画册,用来展示我们的产品和服务,增加品牌影响力。可是,像我这种零基础的小白,完全不知道如何制作啊?对此我感到很焦虑,怕做不好影响公司形象,也怕耽误时…

LR学习笔记——初识lightroom

文章目录 介绍图库界面修改照片界面 介绍 Lightroom是Adobe公司开发的一款用于图片后期处理制作的软件,被称为Adobe Photoshop Lightroom。其增强的校正工具、强大的组织功能以及灵活的打印选项可以帮助加快图片后期处理速度,将更多的时间投入拍摄。 相…

Navicat DML 操作

在表格种插入 列信息 -- 修改数据 update 表名 set 列名 值1, 列名值2,[where 条件]; -- 注意:如果update语句没有加where 表里对应行的全部信息都会被改; -- 删除数据 delecte from 表名 [where 条件]; 未删除前: 执行删除后为: DQL - 条…

打印工具HandyPrint Pro Mac中文版软件特点

HandyPrint Pro Mac是一款打印工具,它支持AIrPrint协议,可以让用户在iPhone、iPad、iPod等设备上进行打印操作,只需要将这些设备连接到Mac电脑的WiFi网络中即可实现打印功能。 ​ HandyPrint Pro Mac软件特点 简单易用:用户只需…

不标年份的葡萄酒质量好吗?

我们在葡萄酒标上经常看到生产年份,也就是指全部葡萄采摘的年份。旧世界葡萄酒产国认为葡萄酒年份对他们的影响较大,而新世界葡萄酒,年份的意义就稍微小些。甚至有一部分葡萄酒酒标上没有年份。在酒标上没有标注年份的葡萄酒,被称…

Java(三)(static,代码块,单例设计模式,继承)

目录 static 有无static修饰的成员变量 有无static修饰的成员方法 static的注意事项 代码块 静态代码块 实例代码块 单例设计模式 饿汉式单例写法 懒汉式单例写法 继承 基本概念 注意事项 权限修饰符 单继承 object 方法重写 子类方法中访问其他成员(成员变量…

Druid介绍

Druid介绍 Druid首先是一个数据库连接池,并且是目前最好的数据库连接池,在功能、性能、扩展性方面,都超过其他数据库连接池,包括DBCP、C3P0、BoneCP、Proxool、JBoss DataSource。但它不仅仅是一个数据库连接池,它还包…

使用frp搭建内网穿透服务

使用frp搭建内网穿透服务 frp 是一个专注于内网穿透的高性能的反向代理应用,支持 TCP、UDP、HTTP、HTTPS 等多种协议,且支持 P2P 通信。可以将内网服务以安全、便捷的方式通过具有公网 IP 节点的中转暴露到公网。 1.下载frp 下载地址 2.服务端安装 …

工作电压范围,转换速率高,相位补偿等特性的双运算放大器芯片D4510的描述

D4510是一块双运算放大器,具有较宽的工作电压范围,转换速率高,相位补偿等特性。电路能在低电源电压下:工作,电源电压范围:双电源为1V-3.5V和单电源电压为2V~7V。 主要特点: ● 低电压工作 ● 转换速率高 ● 动态输…

深度学习领域中的耦合与解耦

在阅读论文的时候应该会看到两个操作,一个是耦合,一个是解耦,经常搭配着出现的就是两个词语,耦合头(Coupled head)以及Decoupled head(解耦合头),那为什么要耦合&#xf…

冬天起不来床怎么办?羊大师给你好建议

冬天起不来床怎么办?羊大师给你好建议 冬季是让人感到懒散的季节,尤其是早上起床。寒冷的天气和温暖的被窝让人们很难离开床铺。如果你也常常遇到这个问题,不要担心,本文小编羊大师将为你分析起床困难的原因,并提供一…

“我“摸爬滚打5年,干了测试工程师,现在测试怎么样了...

目录:导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结(尾部小惊喜) 前言 小刘:…

nginx 代理接口报404 问题排查

今天遇到一个nginx代理后端接口请求报404的问题,问题是这样的,后端由于服务器没有环境,但是需要和前端联调,于是采用cpolar内网穿透的方式,穿出来了。但是前端请求跨域,于是前端用nginx代理了一下后端接口&…

网络工程师网络配置经典例题(五)

1、配置SwitchA的单臂静态BFD特性 [SwitchA] bfd [SwitchA-bfd] quit [SwitchA] bfd 1 bind peer-ip 10.2.2.2 interface vlanif 10 source-ip 10.1.1.1 one-arm-echo [SwitchA-bfd-session-1] discriminator local 1 [SwitchA-bfd-session-1] min-echo-rx-interval 200 …

赠人玫瑰,手有余香,分享5款精致小巧的软件

​ 分享是一种美好的事情,它能让快乐变得更多,它能让悲伤变得更少,我会持续分享一些好用的软件给大家。 1.矢量图形设计——Affinity Designer ​ Affinity Designer是一款屡获殊荣的矢量图形设计软件,适用于 Windows、macOS 和…

微信可以注册小号啦,看看怎么操作

微信支持同一手机号绑定两个账号啦! 生活号和工作号可以分开啦~实用又简单! 详细步骤如下: ①点击微信-我的-设置 ②点击“切换账号” ③点击“添加账号” ④点击“注册新账号” ⑤点击“通过当前微信的手机号辅助注册” ⑥安…

工业4.0时代,烤漆房控制柜如何远程监控?

烤漆房控制柜远程监控方案 一、现状 烤漆房是汽车、机械、家具等工业领域广泛应用的设备,主要用于产品的表面涂装。传统的烤漆房控制柜采用本地控制方式,操作人员在现场进行参数设置和设备控制。这种控制方式需要操作人员需要具备一定的专业知识&#x…

OpenHarmony Ohpm安装历程(个人踩坑,最后安装成功)

大家好,我是【八戒,你又涨价了哎】 以下是我个人在学习OpenHarmony过程中的分享,请大家多多指教 目录 问题描述: 尝试解决 尝试一、 尝试二、 尝试三、 最终解决方案 问题描述: 当我学习到使用OpenHarmony的三方…

劲松中西医医院谭巍主任在线分析:HPV复阳的三大祸首

提到hpv,大家都不陌生,似乎对这个病毒很畏惧。即便如此,我们仍然要知道hpv病毒它与其他病毒有所不同,这是一种微小的DNA病毒,其感染性更,传播速度更快,感染途径更加广泛,可以说给人们…