什么是留存,比如在20200701这天操作了“点击banner”的用户有100个,这部分用户在20200702这天操作了“点击app签到”的有20个,那么对于分析时间是20200701,且“点击banner”的用户在次日“点击app签到”的留存率是20%。

背景

关于用户留存模型是各大商业数据分析平台必不可少的功能,企业一般用该模型衡量用户的活跃情况,也是能直接反应产品功能价值的直接指标;如,boss想要了解商城改版后,对用户加购以及后续下单情况的影响等。如下图,这就是一个典型的留存分析功能:

image.png

问题

通常实现上述需求的传统做法是多表关联,了解clickhouse的攻城狮都清楚,多表关联简直就是clickhouse的天敌;如一张用户行为日志表中至少包含:用户id、行为事件、操作时间、地点属性等,想分析20200909日河南省注册用户次日的下单情况,那么SQL一般会这么写:

select count(distinct t1.uid) r1, count(distinct t2.uid) r2 from

(

select uid from action_log where day='20200909' and action='login' and province='河南省'

) as t1 left join

(

select uid from action_log where day='20200910' and action='order' and province='河南省'

) as t2

using uid

这种方式书写简单、好理解,但是性能会很差,在超大数据集上进行运算是不仅仅影响用户体验,还会因长期占有物理资源而拖垮整个clickhouse上的业务。

解决方法有两种:

使用clickhouse自带的retention函数

Roaringbitmap 通过对数据进行压缩和位运算提高查询性能

Roaringbitmap

通过Roaringbitmap进行用户行为分析是腾讯广告业务中常用的一种实现方案,点击查看 ,文章中内容较多这里挑选干货进行讲解:

bitmap可以理解为一个长度很长且只存储0/1数字的集合,如某个用户通过特定的哈希算法映射到位图内时,那么该位置就会被置为1,否则为0;通过这种方式对数据进行压缩,空间利用率可提示数十倍,数据可以很容易被系统cache,大大减少了IO操作。

在查询之前需要先对数据进行预处理,这里额外构建两张表,用来存储用户的位图信息。

用户行为日志表:table_oper_bit

image.png

向位图表插入数据,原始数据十几亿,插入后结果只有几万行,而且随着数据范围的再扩大,位图表的数据增量变化也不会很明显

image.png

用户基本信息表:table_attribute_bit

image.png

同理table_attribute_bit插入后数据也得到了极大的压缩,最终数据如下图:

image.png

image.png

应用案例

a. 操作了某个行为的用户在后续某一天操作了另一个行为的留存:

如“20200701点击了banner的用户在次日点击app签到的留存人数”,就可以用以下的sql快速求解:

image

b. 操作了某个行为并且带有某个属性的用户在后续的某一天操作了另一个行为的留存:

如“20200701点击了banner且来自广东/江西/河南的用户在次日点击app签到的留存人数”:

image

c. 操作了某个行为并且带有某几个属性的用户在后续的某一天操作了另一个行为的留存:

如“20200701点击了banner、来自广东且新进渠道是小米商店的用户在次日点击app签到的留存人数”:

image

其中bitmapCardinality用来计算位图中不重复数据个数,在大数据量下会有一定的数据误差,bitmapAnd用来计算两个bitmap的与操作,即返回同时出现在两个bitmap中用户数量

查询速度

clickhouse集群现状:12核125G内存机器10台。clickhouse版本:20.4.7.67。查询的表都存放在其中一台机器上。测试了查询在20200701操作了行为oper_name_1(用户数量级为3000+w)的用户在后续7天内每天操作了另一个行为oper_name_2(用户数量级为2700+w)的留存数据(用户重合度在1000w以上),耗时0.2秒左右

该方法的确比较灵活,不仅仅能解决留存问题,还有很多关于事件分析的需求等待我们去探索;然而它的缺点是操作复杂,且不支持对实时数据的分析

retention

通过上面的例子不难看出,腾讯的做法虽然提升了查询的性能,但是操作过于复杂,不便于用户理解和后期的维护;关于这些痛点易企秀数仓这边做法是采用retention进行实现

retention function是clickhouse中高级聚合函数,较bitmap的方式实现留存分析会更加简单、高效;语法如下:

retention(cond1, cond2, ..., cond32);

## cond 为判断条件

## 支持最长32个参数的输入,也就是说 至少支持一个完整自然月的留存分析查询

其中满足条件1的数据会置为1,之后的每一个表达式成立的前提都要建立在条件1成立的基础之上,这正好符合我们对留存模型的定义

那么我们还以上面的3个场景为例方便对比说明:

20200701点击了banner的用户在次日点击app签到的留存人数

SELECT

sum(r[1]) AS r1,

sum(r[2]) AS r2,

r2/r1

FROM

(

SELECT

uid,

retention(date = '20200701' and type='点击banner', date = '20200702' and type='点击app签到' ) AS r

FROM action_log

WHERE date IN ('20200701', '20200702')

GROUP BY uid

)

20200701点击了banner且来自广东/江西/河南的用户在次日点击app签到的留存人数

SELECT

sum(r[1]) AS r1,

sum(r[2]) AS r2,

r2/r1

FROM

(

SELECT

uid,

retention(date = '20200701' and type='点击banner', date = '20200702' and type='点击app签到' ) AS r

FROM action_log

WHERE date IN ('20200701', '20200702') and province IN ('广东', '江西', '河南')

GROUP BY uid

)

按照上面的方式第三个场景也能很快实现,这里留给大家去尝试...

不过该方式与bitmap比也有缺陷,那就是如果用户日志表中不存储用户属性信息时,就需要与用户属性表进行关联查询,两张大表关联,查询性能会相当慢。

总结

条条大路通罗马,clickhouse不但性能上做到极致,在数据分析实现上也提供了大量遍历的途径,详见:

clickhouse最佳实践

clickhouse高级功能上线之mysql实时数据同步

clickhouse 航空数据_clickhouse数据模型之留存分析相关推荐

  1. clickhouse 航空数据_ClickHouse空间分析运用

    ClickHouse ClickHouse是一个用于联机分析(OLAP)的列式数据库管理系统(DBMS). OLAP场景的关键特征 绝大多数是读请求 数据以相当大的批次(> 1000行)更新,而 ...

  2. Clickhouse 专栏---数据模型之留存分析

    什么是留存,比如在20200701这天操作了"点击banner"的用户有100个,这部分用户在20200702这天操作了"点击app签到"的有20个,那么对于分 ...

  3. clickhouse 航空数据_趣头条基于Flink+ClickHouse的实时数据分析平台

    原标题:趣头条基于Flink+ClickHouse的实时数据分析平台 分享嘉宾:王金海 趣头条 编辑整理:王彦 内容来源:Flink Forward Asia 出品平台:DataFunTalk 导读: ...

  4. Shopee ClickHouse 冷热数据分离存储架构与实践

    本文首发于微信公众号"Shopee技术团队". 摘要 Shopee ClickHouse 是一款基于开源数据库 ClickHouse 做二次开发.架构演进的高可用分布式分析型数据库 ...

  5. ClickHouse留存分析工具十亿数据秒级查询方案

    作者:陈璐,腾讯 CSIG 高级数据分析师 本文实践了对于千万级别的用户,操作总数达万级别,每日几十亿操作流水的留存分析工具秒级别查询的数据构建方案.同时,除了留存分析,对于用户群分析,事件分析等也可 ...

  6. java按秒查询数据_ClickHouse留存分析工具十亿数据秒级查询方案

    作者:陈璐,腾讯 CSIG 高级数据分析师本文实践了对于千万级别的用户,操作总数达万级别,每日几十亿操作流水的留存分析工具秒级别查询的数据构建方案.同时,除了留存分析,对于用户群分析,事件分析等也可以 ...

  7. Clickhouse 在大数据分析平台 - 留存分析

    背景 你可能听说过Growingio.神策等数据分析平台,本文主要介绍实现留存分析工具相关的内容.留存分析是一种用来分析用户参与情况/活跃程度的分析模型,可考查进行初始行为后的用户中,有多少人会进行后 ...

  8. 来拿,腾讯数据开发整理的用户留存分析(超详细)

    本文循序渐进的讲述了大数据领域用户分析不断优化的过程.借此抛砖引玉,希望读者勇于探索,追求卓越 最近小c同学一直在做用户留存分析. 这天他跟我大倒苦水:接手前同事的留存分析代码不仅可读性差且效率低. ...

  9. 企业数据可视化实现2020用户留存分析

    目录 1 整体客户留存一览明细表 1.1 图表制作 1.2 总结归纳 2 2020留存走势折线图 2.1 图表制作 2.2 总结归纳 3 活跃用户UV三周留存率条形图 3.1 图表制作 3.2 总结归 ...

  10. 留存分析数据研究心得大公开!告诉你“用户留存率”的重要性

    在笔者过往的互联网从业经历中,曾遇到一个特别棘手的问题:每天都有2-3万的注册用户,可是为什么每天的活跃用户总数却不见增长呢? 出于常识的解释是,用户规模不变,那一定是用户来了又走了,新增多少就流失多 ...

最新文章

  1. Python和NLTK自然语言处理
  2. [译] 你不需要基于 CSS Grid 的栅格布局系统
  3. 广东移动携手远传技术 共建移动客服标杆
  4. 【拿不到offer全额退款】人工智能与 NLP / CV 第三期课程培训招生
  5. 互联网日报 | 6月7日 星期一 | 华为已捐献鸿蒙全部基础能力;芝麻信用7年免押金4000亿;奈雪的茶通过港交所上市聆讯...
  6. java工作流引擎Jflow流程事件和流程节点事件设置
  7. JS/PHP中,数组与字符串的转换,这次总算是记住了
  8. 微课|中学生可以这样学Python(2.2.4节):逻辑运算符
  9. C 设计语言编译生成的是中间语言IL,一、源代码-面向CLR的编译器-托管模块-(元数据IL代码)...
  10. mysql 主键冲突 多个事务回滚_MySQL实战45讲Day38----自增主键不是连续的原因
  11. python将object转换为float_如何在python中将datatype:object转换为float64?
  12. 高等微積分(高木貞治) 1.4節 例2
  13. break , continue , exit
  14. 10分钟学会写一个简单的Mysql存储过程
  15. 语料库资源————(三)
  16. 批量删微博丨2023简易版本控制台批量删除微博代码
  17. c语言程序设计班车管理系统,班车信息管理系统.doc
  18. 2013年度学习计划,放在博客里面时时的警告自己要坚持。
  19. 双重差分法(DID):标准化流程和stata代码实现
  20. 02-QNX 进程管理器(转)

热门文章

  1. 怎么发表医学职称论文
  2. CIT_DM and ML_lecture 1
  3. Springboot(总结完毕!)2021.1.27
  4. 数学通道的应用(十七)-检测DPF是否堵塞
  5. java网络编程 测试题
  6. 修改anaconda/conda的安装路径
  7. 马踏棋盘python_Python基于回溯法子集树模板解决马踏棋盘问题示例
  8. 基于SSM的毕业生实习管理系统设计与实现开题报告
  9. Vue.js 3.0 学习笔记(五)精通监听器
  10. 产业洞察 |都在说数据资产管理,那数据资产到底是什么