Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >人群创建的基础:画像标签BitMap

人群创建的基础:画像标签BitMap

原创
作者头像
张叔叔讲互联网
发布于 2023-10-17 13:38:43
发布于 2023-10-17 13:38:43
1.2K00
代码可运行
举报
运行总次数:0
代码可运行

​上文提到了使用画像宽表可以便捷的创建人群,本文介绍人群创建所依赖的另外一种数据组织形式:标签BitMap。

使用画像宽表圈人的逻辑是从明细数据中找到满足条件的用户并最终构建人群,而使用BitMap进行圈人会对用户进行预聚合,在人群圈选时直接使用聚合后的结果进行计算。首先将指定标签值下的所有用户聚合后生成BitMap,然后基于这些BitMap执行交、并、差操作实现人群筛选。图5-8展示了基于宽表和BitMap进行人群圈选的功能示意图,两种方式最终产出的人群相同。

图5-8 使用宽表和BitMap进行人群圈选示意图
图5-8 使用宽表和BitMap进行人群圈选示意图

BitMap特殊的数据结构决定了其适合做用户聚合并应用到人群圈选场景下。BitMap底层构建了一个bit数组,bit每一位只能存储1或者0,其中数组的索引值映射到UserId,当前索引上的数字是1的时候代表对应的UserId存在,是0的时候代表UserId不存在。图5-9展示了BitMap存储UserId的基本逻辑,UserId不再是一个具体数字而是映射到位数组的索引值上面,借助这一特点可以实现大量UserId数字的压缩、去重、排序和判存。

图5-9 BitMap存储UserId基本原理
图5-9 BitMap存储UserId基本原理

将大量的UserId写入BitMap时,因为相同的UserId所对应的索引位置一样,可以自动实现人群UserId的去重;bit数组索引天然有序,人群UserId写入BitMap可以实现便捷排序;判存是判断UserId是否在人群中,通过判断bit数组指定索引位置的数值是否为1便可以快速判断出UserId是否存在。BitMap以上特点都非常适合存储人群数据,也决定了其在画像平台的广泛使用。

基于Hive标签数据表可以生成BitMap,图5-10展示了性别和常住省标签生成BitMap的示意图。首先基于标签明细数据聚合生成标签值BitMap数据,其执行结果会存储在Hive表中;其次将已经生成的标签值BitMap的Hive表数据写入到ClickHouse表中,该操作可以提高后续查询BitMap的效率;最后在人群创建过程中从数据表中查询出BitMap并计算出人群数据。

图5-10 通过标签Hive表数据生成BitMap
图5-10 通过标签Hive表数据生成BitMap

BitMap是一种位图映射方案,其具体实现方式有多种,在Java语言中可以使用RoaringBitMap进行工程开发。图5-11展示了由标签Hive表生成标签BitMap表的过程中所使用的主要的技术,不同环节涉及BitMap不同数据形式的转换。

图5-11 标签BitMap生成流程图
图5-11 标签BitMap生成流程图

Hive表数据转为RoaringBitMap依赖开源工具包hive-bitmap-udf.jar,其中UDF函数to_bitmap可以将UserId列表转换为RoaringBitMap对象并以binary格式存储到Hive表中。工具包中还包含常用的UDF函数:bitmap_count、bitmap_and和bitmap_or等,可以便捷地对BitMap进行各类操作。Hive表中的BitMap数据经由Spark大数据引擎批量处理后写入ClickHouse表中。ClickHouse中没有binary数据类型,一般通过string类型承接Hive中的binary数据。使用byteToString函数可以将Hive表的bitmap数据转换为string类型,其实现原理是将binary数据转换为byte[],然后通过BASE64编码成string。从ClickHouse中读取到string类型的bitmap数据,借助bytesToBitMap函数可以实现string到RoaringBitMap的转换。多个RoaringBitMap可以在内存中直接进行交、并、差操作,最终实现人群的创建。

Hive表数据生成BitMap 的SQL代码如下所示,通过引入工具包并调用其中的to_bitmap函数将gender下的所有UserId转换为binary格式,并将数据并写入Hive数据表中。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
-- 引入UDF工具包 --
ADD JAR hdfs://userprofile-master:9000/hive-bitmap-udf.jar;
CREATE TEMPORARY FUNCTION to_bitmap AS 'com.hive.bitmap.udf.ToBitmapUDAF';
-- 将数据写入BitMap数据表 --
INSERT OVERWRITE TABLE userprofile_demo.gender_label_bitmap PARTITION(p_date = '2022-08-01')
SELECT
gender,
to_bitmap(user_id)
FROM
userprofile_demo.gender_label
WHERE
p_date = '2022-08-01'
GROUP BY
gender

byte[],string以及RoaringBitMap之间核心转换代码如下所示,通过不同函数的灵活搭配使用可以实现Hive与ClickHouse、数据存储与内存之间数据类型的转换。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// 字节码数组转string
public static String bytesToString(byte[] bytes) throws IOException {
return Base64.getEncoder().encodeToString(bytes);
}
// 字符串转字节数组
public static byte[] stringToBytes(String str) throws IOException {
return Base64.getDecoder().decode(str);
}
// 字节数组转Roaring64Bitmap 
public static Roaring64Bitmap bytesToBitMap(byte[] bytes) throws IOException {
Roaring64Bitmap bitmapValue = new Roaring64Bitmap();
DataInputStream in = new DataInputStream(new ByteArrayInputStream(bytes));
bitmapValue.deserialize(in);
in.close();
return bitmapValue;
}
// Roaring64Bitmap 转字节数组
public static byte[] bitMapToBytes(Roaring64Bitmap bitmap) throws IOException {
ByteArrayOutputStream bos = new ByteArrayOutputStream();
DataOutputStream dos = new DataOutputStream(bos);
bitmap.serialize(dos);
dos.close();
return bos.toByteArray();
}

并不是所有的画像标签都适合转换为BitMap,只有标签值可枚举且数量有限的标签才适合转换为BitMap来支持人群圈选。性别标签有男、女、未知三个标签值,标签值之间有明显的区分度,生成BitMap之后每个BitMap被使用的概率也较高,其比较适合构建标签BitMap。对于在线时长、粉丝数等数值型标签,其标签值不可枚举或者数量庞大,标签值之间没有明显的区分度,此类标签不适合构建BitMap。生成BitMap会消耗大量的计算和存储资源,如果标签值区分度较小,生成的BitMap数据被使用到的概率较低,是对计算和存储资源的浪费。

使用画像宽表还是BitMap要根据业务特点来决定。基于宽表中全量用户的明细数据可以实现所有的人群圈选功能,但是采用BitMap方案的人群创建速度相比宽表模式可以提升50%以上。BitMap适用的标签类型和业务场景有限,要结合实际的数据进行判断。业界一般使用混合模式,优先通过BitMap进行人群创建,不适用的场景下兜底使用画像宽表进行人群圈选。采用混合模式要考虑对齐画像宽表和BitMap的标签时间,这增加了工程的实现复杂度。


本文节选自《用户画像:平台构建与业务实践》,转载请注明出处。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
kaggle案例重复:科比的投篮选择之二
这里用到 group_by()和 summarise()函数。一个简单的小例子理解这两个函数的用法
用户7010445
2020/03/03
6690
跟着GlobalChangeBiology学作图:R语言ggplot2点线图(2)给分面添加注释
本地pdf Global Change Biology - 2022 - Feng - Changes in plant inputs alter soil carbon and microbial communities in forest.pdf
用户7010445
2023/01/06
6510
跟着GlobalChangeBiology学作图:R语言ggplot2点线图(2)给分面添加注释
跟着Nature学作图:R语言ggplot2频率分布直方图/堆积柱形图/散点图
https://www.nature.com/articles/s41586-022-04808-9#MOESM8
用户7010445
2023/01/06
1.3K0
跟着Nature学作图:R语言ggplot2频率分布直方图/堆积柱形图/散点图
R包:ggalign调整和组合多个图形的R包
这个包扩展了ggplot2,提供了用于对齐和组织多个图的高级工具,特别是那些自动重新排序观察结果的工具,比如树形图。它提供了对布局调整和情节注释的精细控制,使您能够创建复杂的、出版质量的可视化,同时仍然使用熟悉的ggplot2语法。
生信学习者
2025/02/25
1570
R包:ggalign调整和组合多个图形的R包
R-ggpattern (绘图花式大赏-2)
上一小节中,我们介绍了ggpattern并鉴赏了ggpattern中两大pattern之一的array_based_pattern。详见:R-ggpattern(绘图花式大赏-1)
生信技能树
2022/12/16
5730
R-ggpattern (绘图花式大赏-2)
跟着Nature Microbiology学作图:R语言ggplot2用单列数据做柱形图
这篇论文中的数据是公开的,争取把论文中的图都复现一下,今天的推文复现Figure3 a 和 b ,这两个类型一样,都是柱形图
用户7010445
2021/12/01
5410
跟着Nature Microbiology学作图:R语言ggplot2用单列数据做柱形图
跟着Nature Genetics学作图:使用ggarrange函数对ggplot2的多个图进行组合
https://www.nature.com/articles/s41588-022-01051-w
用户7010445
2023/01/06
2.9K0
跟着Nature Genetics学作图:使用ggarrange函数对ggplot2的多个图进行组合
R语言ggplot2做柱形图并在指定的位置添加灰色背景
ggplot2作图X轴默认坐标轴的刻度是朝下的,Y轴默认的刻度是朝左的,如果要改为朝上和朝右,该如何设置。之前也有人问过这个问题
用户7010445
2021/11/16
2.2K0
R语言ggplot2做柱形图并在指定的位置添加灰色背景
全网最全的R语言基础图形合集
直方图是一种对数据分布情况进行可视化的图形,它是二维统计图表,对应两个坐标分别是统计样本以及该样本对应的某个属性如频率等度量。
生信学习者
2024/06/12
1010
全网最全的R语言基础图形合集
跟着Environmental Research学作图:R语言ggplot2堆积柱形图叠加折线图(2)
这三个知识点分成2期推文分别来介绍,今天的推文是第二期,介绍带置信区间的折线图和双Y轴
用户7010445
2022/04/08
1.9K0
跟着Environmental Research学作图:R语言ggplot2堆积柱形图叠加折线图(2)
学会这个BBC,你的图也可以上新闻啦!
英国广播公司(British Broadcasting Corporation;BBC)是全球最大的新闻媒体,其中各类新闻稿件采用的统计图表能很好地传达信息。为了方便清洗可重复数据和绘制图表,BBC数据团队用R对数据进行处理和可视化,经年累月下于去年整理绘图经验并开发了R包-bbplot,帮助我们画出和BBC新闻中一样好看的图形。
生信宝典
2022/04/19
4.3K0
学会这个BBC,你的图也可以上新闻啦!
ggplot2|详解八大基本绘图要素
ggplot2是由Hadley Wickham创建的一个十分强大的可视化R包。按照ggplot2的绘图理念,Plot(图)= data(数据集)+ Aesthetics(美学映射)+ Geometry(几何对象)。本文将从ggplot2的八大基本要素逐步介绍这个强大的R可视化包。
生信补给站
2020/08/05
7.2K0
ggplot2|详解八大基本绘图要素
看篮球学R语言:卢卡东契奇到底有多棒?
https://www.kaggle.com/xvivancos/how-good-is-luka-doncic
用户7010445
2020/08/28
6320
看篮球学R语言:卢卡东契奇到底有多棒?
基于 R 语言的科研论文绘图技巧详解(2)
在查阅文献的过程中,看到了几幅非常不错的出版图,今天就跟着小编一起学习下,他们是怎么使用 R 绘制出来的。
庄闪闪
2022/05/24
1K0
基于 R 语言的科研论文绘图技巧详解(2)
R语言学习 - 柱状图
柱状图绘制 柱状图也是较为常见的一种数据展示方式,可以展示基因的表达量,也可以展示GO富集分析结果,基因注释数据等。 常规矩阵柱状图绘制 有如下4个基因在5组样品中的表达值 data_ori <- "Grp_1;Grp_2;Grp_3;Grp_4;Grp_5 a;2.6;2.9;2.1;2.0;2.2 b;20.8;9.8;7.0;3.7;19.2 c;10.0;11.0;9.2;12.4;9.6 d;9;3.3;10.3;11.1;10" data <- read.table(text=data_ori
生信宝典
2018/02/05
2.6K0
R语言学习 - 柱状图
R语言ggplot2每周一图活动:第三周~柱形图和散点图
代码数据来源 https://github.com/z3tt/TidyTuesday/blob/main/R/2019_17_animes.Rmd 加载需要用到的R包 library(tidyverse) library(ggrepel) library(patchwork) library(ghibli) 读取数据 df_ghibli <- readr::read_csv("https://raw.githubusercontent.com/rfordatascience/tidytuesday/
用户7010445
2022/05/23
3590
R语言ggplot2每周一图活动:第三周~柱形图和散点图
跟着Environmental Research学作图:R语言ggplot2堆积柱形图叠加折线图(1)
上图的横坐标轴看起来是离散的,但是我们用连续的数值来做横坐标,是为了后续再同一个图上叠加折线图更方便。
用户7010445
2022/04/08
2K0
跟着Environmental Research学作图:R语言ggplot2堆积柱形图叠加折线图(1)
跟着Nature Genetics 学画图:R语言ggplot2画基因结构示意图
今天试着重复的图片对应着的是论文附件中的Figure8c,基因结构图,论文中文字部分对图的描述是 Gene structure of Lsat_6X11620. Closed bars represent exons, and open bars represent untranslated regions and introns. The positions of the SNPs in the promoter region are indicated by black triangles. An highly associated SNP, A-to-G transition at Chr. 6:15,542,968 is represented by a red triangle.
用户7010445
2021/05/08
1.8K0
跟着Nature Genetics 学画图:R语言ggplot2画基因结构示意图
ggplot2修改坐标轴详细介绍
ggplot2的每个细节都是可以修改的,非常推荐大家系统学习一下,用到再学确实是一种不错的方式,但是如果要提高进阶,还是有必要系统学习的。
医学和生信笔记
2022/11/15
12K0
ggplot2修改坐标轴详细介绍
跟着Science学画图:R语言ggplot2实现图中嵌图
部分数据代码是公开的 下载链接https://zenodo.org/record/4781590#.YSB40Hzivic
用户7010445
2021/10/13
1.4K0
推荐阅读
相关推荐
kaggle案例重复:科比的投篮选择之二
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验