bitmap实践-留存计算

news2024/9/22 9:29:46

目录

  • 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表的时候,维度一定要确定不能组合,比较死板
● 新建表后需要按时间顺序回刷

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

数智赋能,众创众治|易知微为“浙江省数字监管应用建模技能竞赛”提供技术支撑!

11月6日至8日,2023年浙江省数字监管应用建模技能竞赛在省金华监狱举行。浙江省监狱管理局党委书记、局长王争,司法部监狱管理局规划科技处处长常家瑛,浙江省监狱管理局党委委员、副局长朱永忠出席本次活动。 本次建模大赛共有来自全省监狱系…

MODBUS转PROFINET网关TS-180连接西门子PLC和工业称重仪表

项目 随着科技的高速发展,工业自动化行业对日益多样的称重需求越来越高,上海某公司在国内的一个 工业自动化项目中,监控中心系统需要远程实时采集工业称重仪表测量的各种称重参数。该系统使用的是 西门子 S7-300 PLC,支持 PROFINE…

邮箱设置第三方登录授权码获取

以QQ邮箱为例 QQ邮箱设置——账户 开启POP3/SMTP服务——完成验证后获得授权码,保存授权码

微信、支付宝、携程等多款app任意文件读取漏洞

声明 本文仅用于技术交流,请勿用于非法用途 由于传播、利用此文所提供的信息而造成的任何直接或者间接的后果及损失,均由使用者本人负责,文章作者不为此承担任何责任。 一、漏洞描述 微信、支付宝、小米浏览器、携程应用等国内主流软件均存…

gin相关操作--一起学习921190764

gin官方文档 https://gin-gonic.com/docs/quickstart/1. 安装 go get -u github.com/gin-gonic/ginhttps://github.com/gin-gonic/gin简单入门 package mainimport ("github.com/gin-gonic/gin""net/http" )func pong(c *gin.Context) {//c.JSON(http.S…

“Python+”集成技术高光谱遥感数据处理

高光谱遥感数据处理的基础、python开发基础、机器学习和应用实践。重点解释高光谱数据处理所涉及的基本概念和理论,旨在帮助学员深入理解科学原理。结合Python编程工具,专注于解决高光谱数据读取、数据预处理、高光谱数据机器学习等技术难题,…

PPT基础:编辑顶点

目录 编辑顶点对顶点的编辑对线段的编辑编辑顶点用法 编辑顶点 所在位置: 实质:是一种改变图像性质的操作 如何把一个圆形变成三角形:选中其中一个顶点,右键删除一个顶点;靠近某一条边,右键“拉伸弓形”即…

壹基金为爱同行到余村,以一步步健行换一滴滴净水

为帮助乡村儿童喝上干净的、足量的饮用水,壹基金联合可口可乐中国发起为爱同行2023安吉余村公益健行活动。本次活动得到了湖州市安吉县天荒坪镇人民政府、湖州市安吉县天荒坪镇余村村村民委员会的大力支持,由深圳市登山户外运动协会、文益社、悦跑圈联合主办。参与健行不仅能感…

「Python编程基础」第3章:控制流

文章目录 一、用“炒菜”简单介绍下“控制流”二、布尔值三、比较运算符四、 和 操作符的区别五、布尔操作符六、混合布尔和比较操作符七、代码块是什么?八、控制流语句1. if 语句2. else语句3. elif语句4. 总结 九、while循环语句十、break语句十一、continue语句…

竞赛选题 行人重识别(person reid) - 机器视觉 深度学习 opencv python

文章目录 0 前言1 技术背景2 技术介绍3 重识别技术实现3.1 数据集3.2 Person REID3.2.1 算法原理3.2.2 算法流程图 4 实现效果5 部分代码6 最后 0 前言 🔥 优质竞赛项目系列,今天要分享的是 🚩 深度学习行人重识别(person reid)系统 该项目…

Windows通过ssh连接远程服务器并进入docker容器

Windows操作系统可以使用vscode通过ssh远程连接ubuntu服务器: 首先下载安装vscode,然后安装插件Remote-SSH: 通过ctlshiftP可以打开Remote-SSH:connect to host; 输入ssh Userhostname -p port host和hostname对应的是…

力扣 2. 两数相加

Problem: 2. 两数相加 思路与算法 Code /*** Definition for singly-linked list.* public class ListNode {* int val;* ListNode next;* ListNode() {}* ListNode(int val) { this.val val; }* ListNode(int val, ListNode next) { this.val val; this…

numpy报错:AttributeError: module ‘numpy‘ has no attribute ‘float‘

报错:AttributeError: module numpy has no attribute float numpy官网:NumPy 报错原因:从numpy1.24起删除了numpy.bool、numpy.int、numpy.float、numpy.complex、numpy.object、numpy.str、numpy.long、numpy.unicode类型的支持。 解决办法…

HarmonyOS开发:ArkTs常见数据类型(一)

前言 无论是Android还是iOS开发,都提供了多种数据类型用于常见的业务开发,但在ArkTs中,数据类型就大有不同,比如int,float,double,long统一就是number类型,当然了也不存在char类型&a…

系列九、JUC强大的辅助类

一、CountDownLatch 1.1、概述 让一些线程阻塞直到另一些线程完成一系列操作后才被唤醒 1.2、功能 CountDownLatch主要有两个方法,当一个或多个线程调用await方法时,这些线程会阻塞,其它线程调用countDown方法会将计数器减1(调用countDown方…

企业实现员工聊天和转账行为的实时监管

如何解决企业营销团队的管理问题? 在当今竞争激烈的市场环境中,企业营销团队的管理显得尤为重要。营销团队是企业发展的重要支柱,然而,一些常见的问题如员工飞单、私单、辱骂删除客户、离职带走公司客户以及工作不认真、工作量无…

Java笔记-PrintWriter无文件或文件内容为空

代码是这样的: PrintWriter out new PrintWriter(fileName); out.println(object.getValue()); out.close(); 查了下这个类,出现问题不会报异常。 但可以用checkError()函数返回值,判断是否有错误。 如果发现无文件或者文件内容为空&#…

C# Onnx DIS高精度图像二类分割

目录 介绍 效果 模型信息 项目 代码 下载 介绍 github地址:https://github.com/xuebinqin/DIS This is the repo for our new project Highly Accurate Dichotomous Image Segmentation 对应的paper是ECCV2022的一篇文章《Highly Accurate Dichotomous Imag…

猫罐头品牌排行榜盘点!猫罐头哪个牌子好?

很多猫主人会发现他们家的猫咪可能对猫粮感到腻了,或者猫咪平时不爱喝水,还有一些主人可能会注意到猫咪太瘦了,想尝试给它们添加一些猫罐头,但又不确定如何选择。目前市场上的猫罐头品牌众多,确实让人有些困惑。那么&a…

Cesium 问题:输出的 纬度 latitude 是 0

文章目录 问题分析问题 在坐标转换的时候,出现如下问题 分析 在检查代码后,发现我将转换之前的高度默认设置为了 0 ,因此没能正确转换 let positionsOnCircle = [];// 圆面边缘的点 let numPoints = 360; for (let i