一、背景介绍
上一篇文章介绍了CDP中,面对单个标签或群体数十亿的数据如何存储CDP技术系列(一):使用bitmap存储数十亿用户的标签或群体
我们都知道数据仓库的概念,它的里边存储了我们所有的数据,其中就包含了标签或群体所依赖的数据,但是这些数据并不能直接拿来使用,想要变成业务需要的标签或群体数据,还需要进行加工。
数据工程师将数仓里的原始数据,经过一些列的数据作业加工成业务用户需要的源表,比如性别表,学历表,年龄表,购买行为表等等。
有了这些相对规整的源表,接下来就是如何利用这些表,去组合成我们需要的群体,然后通过群体再去做营销,推广等。
本篇要讨论的主要就是使用什么方式快速圈选出人群。
二、问题描述
上文已经讲到有了标签的存储方式和源表,并且当前CDP平台已经有几千+标签,2W+群体,这其中涉及到的源表会非常多且大。
我们遇到的第一个问题,是如何将这么多张源表,加工成对应标签的bitmap?
第二个问题,加工好这些bitmap文件之后,存储在什么地方才能方便后续的使用?
第三个问题,存储好这些标签的bitmap之后,如何快速的进行组合计算,加工成用户需要的群体?
比如我有三个标签:学历,年龄和性别,如何圈出:具有本科学历的,年龄在20到35岁之间的女性群体。

1)ClickHouse简介
2)解决数据存储问题
| Row | user_id | 学历 | 年龄 | 性别 |
| #0 | id1 | 本科 | 24 | 女 |
| #1 | id2 | 本科 | 25 | 男 |
| #2 | id3 | 硕士 | 26 | 女 |
| #3 | id4 | 硕士 | 27 | 男 |
| Row: | #0 | #1 | #2 | #3 |
| user_id | id1 | id2 | id3 | id4 |
| 学历 | 本科 | 本科 | 硕士 | 硕士 |
| 年龄 | 20-24 | 20-24 | 25-28 | 25-28 |
| 性别 | 女 | 男 | 女 | 男 |
| offset | 1 | 2 | 3 | 4 |
CREATETABLE cdp.tag ON CLUSTER DEFAULT(`code` String,`value` String,`version` String,`offset_bitmap` AggregateFunction(groupBitmap, UInt64))ENGINE = ReplicatedMergeTree('/clickhouse/tables/cdp/{shard}/group_1','{replica}')PARTITION BY(code)ORDER BY(code)SETTINGS storage_policy = 'default',use_minimalistic_part_header_in_zookeeper = 1,index_granularity = 8192;
3)解决bitmap加工问题
# 学历标签INSERT INTO cdp.tag_bitmap1SELECT'tag_education' AS code,value AS value,'version1' AS version,groupBitmapState(offset) AS offset_bitmapFROMtag.sourceWHEREvalue IN('本科','硕士')GROUP BYcode,value# 年龄标签INSERT INTO cdp.tag_bitmap2SELECT'tag_age' AS code,value AS value,'version2' AS version,groupBitmapState(offset) AS offset_bitmapFROMtag.sourceWHEREvalue IN('20-24','25-28')GROUP BYcode,value# 性别标签INSERT INTO cdp.tag_bitmap3SELECT'tag_gender' AS code,value AS value,'version3' AS version,groupBitmapState(offset) AS offset_bitmapFROMtag.sourceWHEREvalue IN('男','女')GROUP BYcode,value
WITH(SELECTgroupBitmapOrStateOrDefault(offset_bitmap)FROM(SELECT offset_bitmap FROM cdp.tag_bitmap1 WHERE value IN ('本科'))) AS `bitmap1`,(SELECTgroupBitmapOrStateOrDefault(offset_bitmap)FROM(SELECT offset_bitmap FROM cdp.tag_bitmap2 WHERE value IN('20-24', '25-28'))) AS `bitmap2`,(SELECTgroupBitmapOrStateOrDefault(offset_bitmap)FROM(SELECT offset_bitmap FROM cdp.tag_bitmap3 WHERE value IN('女'))) AS `bitmap3`SELECT bitmapAnd(bitmapAnd(`bitmap1`, `bitmap2`), `bitmap3`) AS bitmap
4)解决快速加工问题
四、现状及展望
英文CK文档:https://clickhouse.com/docs/en/intro

扫一扫,加入技术交流群

