什么是用户画像
在经历了用户的持续增长过后,产品发展进入到存量运营时期,旧有的撒网式线上营销和线下推广带来的业绩增长乏善可陈。运营人员需要对用户有深刻的洞见,以发现新的业务增长点,在该阶段,他们经常会问到类似如下的问题。
1、 上月Xx流失的用户有多少,设备特点,地理位置分布,性别分布什么规律?
2、 我们做的营销活动是否有效,回流用户、复购用户的推动点是什么?
3、 能不能在用户密集的地方开新品体验专门店,如果可以,应该选在哪里?
4、 线下的新门店要开业了,能不能对附近5公里的高潜购机用户进行优惠券发送?
为了回答上面的问题,我们需要对现有的用户进画像建模,用抽象的标签信息和的具体的事件信息去刻画每一个用户。这样一个结合了标签加工,管理,应用的系统称之画像系统。
所谓标签,是对设备和背后的用户进行量化or感性描述的一种方式,常见的如“男性”,“学生党”,“X50用户”“1500元购机预算”等,都是一种标签化的描述。从这些信息产生的方式来看,可以把他们归到统计类,规则类,算法类三大类。
在用户的生命周期内会产生一些基础信息如销售信息,填报的电子保卡信息,从这些原始信息中,我们可以直接获取到用户的性别,生日,住址等标签,这些标签归为统计类。规则标签一般是根据运营的需求和业务口径来确定,例如,把最近一个月每天充电3次,在浏览器检索过oppo,小米,华为的用户为标识为“高潜力购机用户”。算法标签则是利用各种机器学习算法得到的标签信息,常见的如性别预测,年龄预测,住址预测。
画像系统的建设是一个复杂的工程,其中的标签体系建设,标签元数据设计,标签生命周期管理,标签的具体加工方式等每一块都可以深入探讨。下文假设所有标签已生成,仅从数据组织与建模角度出发,调研行业现有的标签架构技术选型过程,思考如何实现架构的弹性可伸缩,标签需求的高效交付与迭代。
常见技术实现方案
上文中,运营提出的第一个问题可以概括为“量级预估”和“受众洞察”,从数据分析的角度来看,就是对一个以imei为主键的标签宽表进行多条件过滤(where 机型=x27 and 上月离网标签=true and … )后的整体count distinct和多维度group by后的count distinct。在讨论该功能的具体实现及常见的建模方式之前,先简单介绍一下标签的格式化描述。
目前,在表述一个标签时,我们用tag_id和tag_socre去联合描述,tag_id和标签的名称,口径定义,父子关系,创建时间等元信息,组成一张维表,使用标签时,通过tag_id在维表中匹配唯一的标签。在这些具体的标签中,有的是离散型的,如性别标签“男”(tag_id=10),“女”(tag_id=11),这种标签类下的候选值可枚举,通过一个标签id即可表述出完整意思。有些标签是连续型的,标签值不可枚举,只凭id无法表述完整意思,例如销售日期标签,我们只能用“销售日期”+“2020-12-12 00:34”(tag_id+tag_score)的方式去描述,这是引入tag_score的一个目的之一。
下面开始介绍常见的建模方式。
标签竖表
标签竖表即各个标签分门别类,放在不同的数据表中,表结构可能如下图所示,其中包含了三个关键字段,imei,tag_id,tag_score。
性别标签表
| Imei | Tag_id | Tag_score |
|---|---|---|
| I1 | 1 - -男 | 1 |
| I2 | 2 - -女 | 1 |
| I3 | 2 - -女 | 1 |
地理位置标签表
| Imei | Tag_id | Tag_score |
|---|---|---|
| I1 | 3 - -深圳 | 1 |
| I2 | 4 - -广州 | 1 |
在竖表建模下,要获得指定条件的用户量级,需要对多个表进行join联查,一个可能的sql如下图所示。该方式优点在于扩展性好,当增加一个类别的标签时,只需要新增一张标签表,同时在查询的sql中关联上该表即可。 <br />但在imei数量3亿+的情况下,多表join后再进行count distinct耗时可能需要半个小时之多,对于一个功能性数据产品而言,要用户等待半个小时才能获取到数据,显然是不可接受的。
| select count(distinct tmp1.imei) from (select imei from table1 where tag_id=filter1) tmp1 inner join (select imei from table2 where tag_id=filter2) tmp2 on tmp1.imei = tmp2.imei inner join (select imei from table3 where tag_id=filter3) tmp3 on tmp1.imei=tmp2.imei |
|---|
标签宽表hive
鉴于标签竖表在查询时间上存在的缺陷,一个通常的方案是把竖表转化为标签宽表,即将上文中所有的标签类别表union all 后再goup by imei。当所有的标签信息汇总到一行后再按表结构把数据填充到hive标签宽表中(类似使用一张基础标签表 full join 所有剩下的标签表),最终的标签宽表列可能达到千位数。
该方案的优点在于所有的标签都汇总到了一张表,配合MPP查询引擎如presto、impala后,(常见的查询sql如下图所示),可以实现多条件过滤后的count distinct时长在分钟级别以内。但是,用户的需求是苛刻的,他们希望查询的速度快一点,再快一点,让他们能在眨眼的瞬间就能得知受众的量级。
除了在用户感知层上存在不足外,从开发运维的角度上看,该模式也存在一个弊端,即新增标签时需要修改原有的表结构,侵入原有的etl代码。更要命的是,由于hive的缺陷,表字段只能增不能减,当旧标签需要下架时只能删表重建。
| select count(distinct imei) from tab_wide where filter1=condition1 and filter2=condition2 and filter3=condition3 |
|---|
标签宽表Hbase|ES
用固定表结构的存储载体如hive来管理标签宽表不是一个理想的方案,于是行业内有部分企业使用了hbase来存放标签宽表。Hbase是架在Hdfs上的分布式数据库,物理存储上采用kv键值对,逻辑视图上采用了列族和列的组织方式。这一特性意味着hbase中的每一行都可以有自己独特的列定义,天然适合无固定schema的标签宽表。再加上Hbase的主键采用了顺序索引, k到v的单点数据检索十分高效,和业务快速检索数据的诉求不谋而合。
但是,原生hbase只支持主键一级索引,对非主键的标签进行检索会大范围scan数据,性能下降明显。此外,habse的协处理器在进行大数据量的聚合操作时容易出现性能瓶颈,如要生产可用,需要对hbase进行二次开发,参考华为的操作(Lemon Bitmap)。
标签宽表的载体除了Hbase,业界的另外一个流行方案为使用ES。Es的全文索引使得任意多条件的检索和过滤在10秒级以内,且由于主键的唯一性,在对主键进行单维度聚合时,也能达到很好的效果。由于拥有这两大特性,绝大多数的中小型公司在搭建画像系统时采用了ES作为主要支撑。但是,原生的ES也有自己的不足,例如
1、 其查询语言为DSL(多维检索如下图所示),习惯了sql风格的数据分析人员需要花费一点时间才能上手。
2、 针对非主键的聚合操作是不精确的,且在多维度上卷聚合时性能下降明显。
3、 文档式存储数据,占用空间较大,在海量数据导入时有性能瓶颈。
为了克服原生ES的种种缺陷,部分公司进行了二次开发,引入了Bitmap插件
| { “query”:{ “filtered”:{ “filter”:{ “range”:{ xxxx } }, “query”:{ “match”:{ xxxx } } } } } |
|---|
我们注意到,在采用宽表建模的基础上,当遇到性能瓶颈时,无论时Hbase还是Es,都将目光投到了Bitmap身上,Bitmap是如何加速数据检索的呢?
索引倒排与BitMap
回顾上文,在对宽表进行多条件where查询时,相当是在做集合的交并补操作。既然是集合操作,我们可以跳出当前的标签表设计范式,参考Es的倒排索引策略,将标签信息表做索引倒排,一个可能的表结构如下图所示。
| tag_id | imei |
|---|---|
| tag1 - - 女 | [i1、i2、i3] |
| tag2 - - 男 | [i4、i5、i6] |
| tag3 - - 深圳 | [i1、i2、i3、i7、i8] |
| tag3 - - 高消费 | [i4、i5、i6、i7、i8] |
在做了上述转化后,标签k对应的v就是一个imei集合,前一章节中对宽表的多条件检索就转化成了标签集合之间的操作,实现的伪代码如下图所示。
| count(tag1 & tag2 & tag3 ~ tag4) |
|---|
为了实现伪代码中的与、或、非等集合操作,需要对imei进行了整型映射,将imei集合转化为bit集合。在这里,我们引入了第一个重要的位图 -“EMB”存在位图,EMB的引入为集合的“非”操作带来了便利性,具体转化参考下图。
1、 imei到整型值的映射:对imei进行全量排序,新加入的imei逐渐递增。
2、 EMB存在位图:位图在数据结构上就是一块连续的内存空间,在代码中可以用bit数组来代替,该数组指定索引位置对应的imei如果存在,就标记为1,反之标记为0
在对imei进行了如上的转化后,标签表转化下图所示的样式。
| tag_id | imei-bitmap |
|---|---|
| tag1 - - 女 | Bitmap1 |
| tag2 - - 男 | Bitmap2 |
| tag3 - - 深圳 | Bitmap3 |
离散型标签在进行bitmap转化时比较简单,整理上述逻辑可以形成如下步骤。<br />1、 先进行imei数值化映射<br />2、 再group by 需要的标签列,<br />3、 最后把数据加载到bitmap承载体中即可。<br />在画像系统中,离散型标签的主要检索条件为“等于”和“不等于”,对标签检索出来的结果,后续主要做count和生成人群包操作。在做等于过滤时,直接选择具体的标签bitmap即可,在做不等于过滤时,需要对选定的bitmap和EMB做“异或”操作。如果需要得到结果对应的imei明细,需要反解出bit对应的imei值,具体如下图所示。<br /><br />**切片索引**<br />离散型标签在进行bitmap转化时,采用一个标签到一个bitmap的转化策略。连续类标签由于标签值不可枚举,或者枚举数量巨大,例如销售金额,购买时间,用户积分等,如果也采用一个标签值对应的imei信息转化为一个bitmap的策略,会生成大量的稀疏位图,占用大量的存储空间。为了解决这个问题,研究人员提出了位图切片索引的概念。<br />为了感性的理解切片索引,以用户积分标签案例来进行说明。积分值的取值范围为两位数(00~99),我们把个位数为0的imei存到一个bitmap,把个位数为1的imei存到一个bitmap,依此类推可知,个位数0~9需要10个bitmap来表示,十位数0~9也需要10个bitmap,我们用20个bitmap就表示了0~99这个区间的信息,可见,该策略带来的数据压缩比十分可观。在这种建模策略中,一个标签值的完整信息被分散到多个bitmap存放,单个bitmap只是信息的一个切片,故为切片索引。<br />更进一步,我们可以把十进制的数值转化为二进制的数值,转化后每个位置只有0和1两种情况,这和bitmap可以更好契合。下文用一个范围在0~7的数值标签(labelx)来举例说明。<br /><br />案例中的labelx标签值的取值范围为0~7,在不考虑null值情况下,转化为二进制后用三个bitmap即可完整表示,(B0、B1、B2)。区别于离散类标签,连续值类型标签的常用检索除了“等于“、”不等于”还经常出现“小于”、“小于等于”、“大于”、“大于等于”等范围谓词,在切片索引建模策略下,通过何种算法获取到这些结果Bitmap呢?<br />Patrick O’Neil在论文Improved Query Performance with Variant Indexes 中详细阐述了在切片索引上求sum、avg、min、max等聚合函数以及范围检索的算法,本文仅做简单搬运,取范围检索算法如下。其中c为任意一常数<br />1、 Bgt 表示大于某值的目标bitmap,例如labelx > c<br />2、 Bge 表示大于等于某值的bitmap,例如labelx >= c<br />3、 Beq表示等于某值的bitmap,例如labelx = c<br />4、 Blt表示小于某值的bitmap,例如labelx < c<br />5、 Ble表示小于等于某值的bitmap,例如labelx <= c<br />6、 Bnn表示该标签值为not null的bitmap,若该标签默认值为0,没有labelx为null的imei,则Bnn=EMB<br /> <br /><br />算法中一次性得到了Bgt,Bge,Beq,Blt,Ble,如果只需要得到部分值,可做相应简化。L例如,在labelx切片索引中,需要利用上述算法检索到 labelx=3的所有imei,过程如下。<br /><br />上述算法,详细展开过程如下图所示<br /><br />图中,最后标黄的部分即为目标imei。其他非等值条件检索过程与之类似,不再赘述。<br />**工程承载与开源框架**<br />由上文可知,在多读少写的数仓建模场景下,完全可以对Bitmap进行二次封装,抽象出一套更通用的工具来加速数据检索。开源领域的Pilosa,国内腾讯的Hermes都是基于这一思想发展而成的。<br />如果只需要简单的满足画像分析中的count distinct和group by等常用操作,也可以使用Clickhouse,其中开箱即用的Bitmap功能为快速搭建画像分析系统带来了可能性,行业内如苏宁易购,贝壳找房,字节等公司都有过相关的实践,详细资料可后续的“参考文章”<br /> <br />**参考博文**<br />1、商业DMP数据管理平台的架构与实践 [https://mp.weixin.qq.com/s/Xs-sSZFx9FWPGtg_X6gU4g](https://mp.weixin.qq.com/s/Xs-sSZFx9FWPGtg_X6gU4g)<br />2、用户画像的数据该怎么存?[https://mp.weixin.qq.com/s/0Gbv2-1tkVlFFYe-QG47bQ](https://mp.weixin.qq.com/s/0Gbv2-1tkVlFFYe-QG47bQ)<br />3、用户画像数据建模方法 [https://mp.weixin.qq.com/s/S-JkzPwOzZQZcdNSkrr68w](https://mp.weixin.qq.com/s/S-JkzPwOzZQZcdNSkrr68w)<br />4、标签主题建设 [https://mp.weixin.qq.com/s/mkqSuqKB08m4iRWwzmy2Fw](https://mp.weixin.qq.com/s/mkqSuqKB08m4iRWwzmy2Fw)<br />5、用户画像分享视频资料 <br />[https://wx0e9b298caef33b9a.h5.xiaoe-tech.com/v1/course/column/p_5f0ebe96e4b04349896bfb76?type=3](https://wx0e9b298caef33b9a.h5.xiaoe-tech.com/v1/course/column/p_5f0ebe96e4b04349896bfb76?type=3)<br />6、PPT下载地址:链接:[https://pan.baidu.com/s/1czrYqovB2htnWrG5Dc0NHQ](https://pan.baidu.com/s/1czrYqovB2htnWrG5Dc0NHQ) 提取码:yun6<br />7、用户画像标签体系与数据建模整体解决方案-公安领域[https://wenku.baidu.com/view/1d731351e109581b6bd97f19227916888486b9a1.html?fr=search-1](https://wenku.baidu.com/view/1d731351e109581b6bd97f19227916888486b9a1.html?fr=search-1)<br />8、企业级大数据项目之新闻用户画像,Hbase在用户画像中的应用<br /> [https://wenku.baidu.com/view/578b5000ed3a87c24028915f804d2b160a4e865d.html?fr=search-1](https://wenku.baidu.com/view/578b5000ed3a87c24028915f804d2b160a4e865d.html?fr=search-1)<br />9、hbase在华为用户画像中的应用 [https://bbs.huaweicloud.com/blogs/163489](https://bbs.huaweicloud.com/blogs/163489)<br />10、bitmap在用户画像中的应用 [https://blog.51cto.com/sbp810050504/2420208](https://blog.51cto.com/sbp810050504/2420208)<br />11、携程用户画像架构 [https://www.jianshu.com/p/564cb09e2771](https://www.jianshu.com/p/564cb09e2771)<br />12、魅族用户画像架构 [https://juejin.im/post/6844903605246361607](https://juejin.im/post/6844903605246361607)<br />13、ES在爱奇艺用户画像中的应用 [https://www.itdks.com/Home/Course/detail?id=17521](https://www.itdks.com/Home/Course/detail?id=17521)<br />14、基于hbase的用户画像查询 [http://vlambda.com/wz_wChoocc5v9.html](http://vlambda.com/wz_wChoocc5v9.html)<br />15、数果科技用户画像架构 [https://myslide.cn/slides/20795](https://myslide.cn/slides/20795)<br />16、bitmap存储海量标签 [https://leriou.github.io/2017-12-29-user-tag-sys-on-bitmap/](https://leriou.github.io/2017-12-29-user-tag-sys-on-bitmap/)<br />17、bitmap在贝壳找房 [https://mp.weixin.qq.com/s/VijSTxDj65cAl2XmbWHiJA](https://mp.weixin.qq.com/s/VijSTxDj65cAl2XmbWHiJA)<br />18、苏宁用户画像 [http://bos.itdks.com/0c17b65d1d9d45cfbcf584de9d9b4168.pdf](http://bos.itdks.com/0c17b65d1d9d45cfbcf584de9d9b4168.pdf)<br />19、魅族用户画像架构 [http://www.uml.org.cn/bigdata/201708282.asp](http://www.uml.org.cn/bigdata/201708282.asp)<br />20、clickhouse在头条dmp中应用 [https://www.infoq.cn/article/lrVSgWF9WZNzLkLF8rop](https://www.infoq.cn/article/lrVSgWF9WZNzLkLF8rop)<br />21、神策帮助手册<br /> [https://manual.sensorsdata.cn/sps/latest/%E5%88%9B%E5%BB%BA%E7%94%A8%E6%88%B7%E6%A0%87%E7%AD%BE-7553228.html](https://manual.sensorsdata.cn/sps/latest/%E5%88%9B%E5%BB%BA%E7%94%A8%E6%88%B7%E6%A0%87%E7%AD%BE-7553228.html)<br />22、talkingData画像、标签 [https://mp.weixin.qq.com/s/MJcC0AivIjiRiKOnwBz0vw](https://mp.weixin.qq.com/s/MJcC0AivIjiRiKOnwBz0vw)<br />23、clickhouse的核心特性和架构 [https://baijiahao.baidu.com/s?id=1672975468068246919&wfr=spider&for=pc](https://baijiahao.baidu.com/s?id=1672975468068246919&wfr=spider&for=pc)<br />24、clickhouse在苏宁的应用与实践 [https://mp.weixin.qq.com/s/hub2Fqd60BmRnFlA9qNlTw](https://mp.weixin.qq.com/s/hub2Fqd60BmRnFlA9qNlTw)<br />25、泛谈用户标签 [https://mp.weixin.qq.com/s/nqUg6AjGPa7gMo6KX4wCOQ](https://mp.weixin.qq.com/s/nqUg6AjGPa7gMo6KX4wCOQ)<br />26、clickhouse在携程的应用 [https://mp.weixin.qq.com/s/cqbzH9x5aESPBVG8NiaqjQ](https://mp.weixin.qq.com/s/cqbzH9x5aESPBVG8NiaqjQ)<br />27、clickhouse在腾讯的应用实践 [https://blog.csdn.net/Tencent_TEG/article/details/102713763](https://blog.csdn.net/Tencent_TEG/article/details/102713763)<br />28、clickhouse在QQ音乐的应用 [https://mp.weixin.qq.com/s/_pXPDbhqC1B1HQWQQEfAGw](https://mp.weixin.qq.com/s/_pXPDbhqC1B1HQWQQEfAGw)<br />29、clickhouse帮助文档 [https://clickhouse.tech/docs/zh/development/architecture/](https://clickhouse.tech/docs/zh/development/architecture/)<br />30、连续标签的bitmap化 [http://mdjhny.github.io/2019/02/23/bitmap-magic/](http://mdjhny.github.io/2019/02/23/bitmap-magic/)<br />31、漫画bitmap [https://zhuanlan.zhihu.com/p/54783053](https://zhuanlan.zhihu.com/p/54783053)<br />32、切片索引 [https://www.cs.umb.edu/~poneil/SIGBSTMH.pdf](https://www.cs.umb.edu/~poneil/SIGBSTMH.pdf)<br />33、bitmap实现范围检索 [https://www.pilosa.com/blog/range-encoded-bitmaps/](https://www.pilosa.com/blog/range-encoded-bitmaps/)<br />34、Bit map and Bit-Slice indexing [https://medium.com/pulseque/bit-map-and-bit-slice-indexing-f6c44a61628d](https://medium.com/pulseque/bit-map-and-bit-slice-indexing-f6c44a61628d)<br />** **
BY —- 西红柿
