背景
Clickhouse是一个性能强悍的OLAP系统,经常被用于用户画像等场景。
在用户画像场景场景中,经常需要按照某一指标对人群进行N等分,然后对每个人根据指标所处的范围打上对应标签。比如某游戏公司记录了玩家每周的游戏时长,需要将所有玩家平均划分为10个等级,从轻度玩家到深度沉迷玩家,以此为依据制定匹配规则。现在有了所有玩家的游戏时长数据,如何对他们进行十等分划分,使得每个区间内的人数都相等呢?
示例
首先模拟一张表,uid代表账户,name代表名字,game_length_per_week代表每周游戏时长,为了方便,其他字段省略。
CREATETABLE default.sample( `uid` String, `name` String, `game_length_per_week` UInt64 )ENGINE = MergeTree()ORDERBY uid
然后模拟一些数据,插入表中。
insertinto sample values('ab2','husky',37),('ab1','sam',35),('a4b','jim',36),('44b','jane',29),('pa4b','dany',35),('pgb','james',14),('ppb','leo',19),('ab-2','husky',1),('ab-1','sam',4),('a4-b','jim',6),('4-4b','jane',7),('pa-4b','dany',9),('pg-b','james',12),('pp-b','leo',14)
通过使用 quantilesExactExclusive(0.1 ,0.2,...)(exp)函数进行查询。
SELECT quantilesExactExclusive(0.1,0.2,0.3,0.4,0.5,0.6,0.7,0.8,0.9)(game_length_per_week)FROM sample
可以看到,查询结果已经根据总数进行了十等分, 根据游戏时长,level 1定义为2.5h以下,level 2定义为2.5h-6h之间。
┌─quantilesExactExclusive(0.1,0.2,0.3,0.4,0.5,0.6,0.7,0.8,0.9)(game_length_per_week)─┐ │ [2.5,6,8,12,14,19,32,35,36.5] │ └────────────────────────────────────────────────────────────────────────────────────────────┘
此时根据上面函数得到的结果,可以进一步使用roundDown(x, [array]) 函数,将以上结果作为函数输入中的[array]参数,进而为每个用户创建游戏沉迷等级的标签。
相关资料
可以通过官网看到quantilesExactExclusive相关的使用介绍。
https://clickhouse.com/docs/en/sql-reference/aggregate-functions/reference/quantiles
roundDown(x, [array]) 函数可以参考另一篇文章。
https://developer.aliyun.com/article/895087?spm=a2c6h.13148508.setting.11.10d14f0e8pvm4H
钉钉扫描下方二维码加入EMR-Clickhouse产品交流群一起参与讨论~