摘要:在挪动互联网时代,用户数量宏大,标签数量泛滥,用户标签的数据量微小。用户画像零碎中,对于标签的存储和查问,不同的企业有不同的实现计划。以后支流的实现计划采纳 ElasticSearch 计划。但基于 ElasticSearch 构建用户画像平台,往往面临灵活性有余、资源开销大、无 SQL 接口开发不便等问题。为此,本文提供了一种基于华为 MRS ClickHouse 构建用户画像零碎的办法。
本文分享自华为云社区《基于 MRS-ClickHouse 构建用户画像零碎计划介绍》,作者:hourongqi。
1. 业务场景
用户画像是对用户信息的标签化。用户画像零碎通过对收集的各维度数据,进行深度的剖析和开掘,给不同的用户打上不同的标签,从而刻画出客户的全貌。通过用户画像零碎,能够对各个用户进行精准定位,从而将其利用于个性化举荐、精准营销等业务场景中。用户画像零碎曾经被各个企业宽泛采纳,是大数据落地的重要形式之一。
在挪动互联网时代,用户数量宏大,标签数量泛滥,用户标签的数据量微小。用户画像零碎中,对于标签的存储和查问,不同的企业有不同的实现计划。以后支流的实现计划采纳 ElasticSearch 计划。但基于 ElasticSearch 构建用户画像平台,往往面临灵活性有余、资源开销大、无 SQL 接口开发不便等问题。为此,本文提供了一种基于华为 MRS ClickHouse 构建用户画像零碎的办法。
2. 为什么基于 MRS-ClickHouse 构建标签查问零碎
2.1 MRS-ClickHouse 简介
MRS-ClickHouse 是一款面向联机剖析解决的列式数据库。其最外围的特点是极致压缩率和极速查问性能。MRS-ClickHouse 反对 SQL 查问,且查问性能好,特地是基于大宽表的聚合剖析查问性能十分优异,比其余剖析型数据库速度快一个数量级。
ClickHouse 有如下特点:
• 齐备的 DBMS 性能
ClickHouse 领有齐备的数据库治理性能,具备一个 DBMS 根本的性能,包含 DDL、DML、权限管制、数据备份与复原、分布式治理。
• 列式存储与数据压缩
ClickHouse 是一款应用列式存储的数据库,数据按列进行组织,属于同一列的数据会被保留在一起,列与列之间也会由不同的文件别离保留。在执行数据查问时,列式存储能够缩小数据扫描范畴和数据传输时的大小,进步了数据查问的效率。
• 向量化执行引擎
ClickHouse 利用 CPU 的 SIMD 指令实现了向量化执行。SIMD 的全称是 Single Instruction Multiple Data,即用单条指令操作多条数据,通过数据并行以进步性能的一种实现形式,它的原理是在 CPU 寄存器层面实现数据的并行操作。
• 关系模型与 SQL 查问
ClickHouse 齐全应用 SQL 作为查询语言,提供了标准协议的 SQL 查问接口,使得现有的第三方剖析可视化零碎能够轻松与它集成对接。
同时 ClickHouse 应用了关系模型,所以将构建在传统关系型数据库或数据仓库之上的零碎迁徙到 ClickHouse 的老本会变得更低。
• 数据分片与分布式查问
ClickHouse 集群由 1 到多个分片组成,而每个分片则对应了 ClickHouse 的 1 个服务节点。分片的数量下限取决于节点数量(1 个分片只能对应 1 个服务节点)。
ClickHouse 提供了本地表(Local Table)与分布式表(Distributed Table)的概念。一张本地表等同于一份数据的分片。而分布式表自身不存储任何数据,它是本地表的拜访代理,其作用相似分库中间件。借助分布式表,可能代理拜访多个数据分片,从而实现分布式查问。
2.2 位图索引介绍
位图是一种通过数组下标与某些特定的值进行关联的数据结构。在位图中,每一个元素占用 1 个比特位。比特位为 1 时,示意对应的元素有该特定的值。反之则示意没有。
举例:
ID 汇合:[0,1,4,5,6,7,9,10,13,14]
通过位图能够示意为:11001111 01100110
如下图所示:
位图索引是一种应用位图的非凡索引,次要针对大量雷同值的列而创立。位图中地位编码中的每一位示意对应的数据行的有无。位图索引适宜固定值的列,如性别、婚姻状况、行政区等等。而不适宜像身份证号、生产金额这种离散值的列。用户画像场景中,每一个标签,对应大量的人群。标签的数量是无限的枚举值,这一特点非常适合位图索引。
举例:
假如有两个标签,一个是标签 1 - 持有贵金属,另一个是标签 2 - 持有保险。各个持卡人领有的标签状况如下表所示。
从中,咱们能够看到,有标签 1 - 持有贵金属的持卡人 ID 汇合是:[0,1,4,5,6,7,9,10,13,14]。有标签 2 - 持有保险的持卡人 ID 集群是:[2,3,5,7,8,11,12,13,15]。
当咱们须要查问同时有这个标签的用户时,基于位图索引,只须要将两个标签相应的位图进行位运算,即可失去最终后果。这样,标签数据的存储空间占用十分小,标签计算的速度十分快。
2.3 MRS-ClickHouse 原生反对位图索引
在 ClickHouse 呈现之前,如果要将位图索引利用于用户画像场景,须要本人构建位图数据结构、治理位图索引,应用门槛较高。好消息是,MRS-ClickHouse 原生提供了对位图数据结构和地位索引的反对,将位图的构建及保护封装在 ClickHouse 外部。使用者基于 ClickHouse 构建位图索引变成十分的简略。
ClickHouse 位图构造函数:
ClickHouse 地位操作函数:
ClickHouse 位图运算后果获取函数:
综上,为什么是抉择基于 ClickHouse 构建标签查问零碎?
- ClickHouse 查问速度快,最快可达亚秒级响应;
- ClickHouse 内置位图数据结构,不便构建位图索引,晋升标签查问性能;
- 基于 JDBC/SQL 接口,开发更简略;
- 基于 MPP 架构,可横向扩大;
3. 如何基于 MRS-ClickHouse 构建标签查问零碎
在 ClickHouse 中创立一张原始标签表,将原始标签数据导入其中。而后基于标签原始表构建标签位图表,并创立对应的分布式表。下层标签查问利用基于标签位图表 (分布式表) 进行标签查问。
流程如下图所示:
具体过程如下文所述。
Step 1:创立标签原始表,导入标签原始数据
首先,创立一张标签原始表,保留标签原始数据。上游零碎计算出的标签后果数据,写入本表中。本表为本地表。其建表语句如下:
CREATE TABLE IF NOT EXISTS tbl_tag_src ON CLUSTER default_cluster(
tagname String, -- 标签名称
tagvalue String, -- 标签值
userid UInt64
)ENGINE = ReplicatedMergeTree('/clickhouse/default/tables/{shard}/tbl_tag_src','{replica}')
PARTITION BY tagname
ORDER BY tagvalue;
而后创立分布式表:
CREATE TABLE IF NOT EXISTS default.tbl_tag_src_all ON CLUSTER default_cluster
AS tbl_tag_src
ENGINE = Distributed(default_cluster, default, tbl_tag_src, rand());
数据预览如下:
Step 2:创立标签位图表,构建标签位图
创立一张标签位图表,先创立本地表。本地表用于保留标签位图数据。其创立语句如下:
-- 创立位图表,先创立本地表
CREATE TABLE IF NOT EXISTS tbl_tag_bitmap ON CLUSTER default_cluster
(
tagname String, -- 标签名称
tagvalue String, -- 标签值
tagbitmap AggregateFunction(groupBitmap, UInt64) --userid 汇合
)
ENGINE = ReplicatedAggregatingMergeTree('/clickhouse/default/tables/{shard}/ tbl_tag_bitmap','{replica}')
PARTITION BY tagname
ORDER BY (tagname, tagvalue)
SETTINGS index_granularity = 128;
而后再创立对应的分布式表。分布式表用于下层利用查问标签。其建表语句如下:
CREATE TABLE IF NOT EXISTS default.tbl_tag_bitmap_all ON CLUSTER default_cluster
(
tagname String, -- 标签名称
tagvalue String, -- 标签值
tagbitmap AggregateFunction(groupBitmap, UInt64) --userid 汇合
)
ENGINE = Distributed(default_cluster, default, tbl_tag_bitmap, rand());
将标签原始表的数据导入标签位图表中。并在导入过程中,应用 groupBitmapState()函数构建位图。SQL 语句如下:
-- 导入数据, 将同一个标签的所有 userid 应用 groupBitmapState 函数合并成一个 bitmap
INSERT INTO tbl_tag_bitmap_all
SELECT tagname,tagvalue,groupBitmapState(userid)
FROM tbl_tag_src_all
GROUP BY tagname,tagvalue;
Step 3:基于分布式表疾速检索标签
查问持有贵金属产品,并且性别是男的 userid 列表:
WITH
(SELECT tagbitmap FROM tbl_tag_bitmap_all WHERE tagname = '持有产品' AND tagvalue = '贵金属' LIMIT 1) AS bitmap1,
(SELECT tagbitmap FROM tbl_tag_bitmap_all WHERE tagname = '性别' AND tagvalue = '男' LIMIT 1) AS bitmap2
SELECT bitmapToArray(bitmapAnd(bitmap1, bitmap2)) AS res
别离统计持有保险的客户中,男性和女性的总人数:
---- 查问持有保险的客户中,男性人数:WITH
(SELECT tagbitmap FROM tbl_tag_bitmap_all WHERE tagname = '持有产品' AND tagvalue = '保险' LIMIT 1) AS bitmap1,
(SELECT tagbitmap FROM tbl_tag_bitmap_all WHERE tagname = '性别' AND tagvalue = '男' LIMIT 1) AS bitmap2
SELECT bitmapCardinality(bitmapAnd(bitmap1, bitmap2)) AS res
---- 查问持有保险的客户中,女性人数:WITH
(SELECT tagbitmap FROM tbl_tag_bitmap_all WHERE tagname = '持有产品' AND tagvalue = '保险' LIMIT 1) AS bitmap1,
(SELECT tagbitmap FROM tbl_tag_bitmap_all WHERE tagname = '性别' AND tagvalue = '女' LIMIT 1) AS bitmap2
SELECT bitmapCardinality(bitmapAnd(bitmap1, bitmap2)) AS res
4. 总结
针对用户画像场景中的海量标签查问,传统的计划存在灵活性有余、资源耗费大、短少 SQL 接口开发难度大等问题。基于华为 MRS-ClickHouse,能够十分不便的构建位图索引,实现海量标签数据的实时检索。MRS-ClickHouse 让开发成本大幅升高,标签查问更快响应,让精准营销更便捷。
华为云 FusionInsight MRS 云原生数据湖已广泛应用于政府、金融、运营商、大企业、互联网等行业,携手 800+ 合作伙伴,服务于寰球 60+ 国家和地区 3000+ 政企客户。
点击关注,第一工夫理解华为云陈腐技术~