Kyligence Copilot - AI 数智助理,以 AI 变革企业经营与管理! 立即了解更多

【视频 + PPT】如何使用 Kylin 进行海量自定义标签的用户画像分析?

2019年 12月 27日

上周,Kyligence 的两位资深讲师为大家带来了《如何使用 Kylin 进行海量自定义标签的用户画像分析》线上分享。错过直播的同学可以直接点击此处查看视频和下载演讲资料。

以下为 Q&A 实录

功能原理

Q:在什么业务场景下会使用 intersect_count 函数?
A: intersect_count 函数使用的业务场景,包括按各类标签和标签值做用户筛查、统计等。如按客户数,地区分布、年龄分布、手机品牌分布做用户筛查,以及自由组合标签圈选用户等。

Q:intersect_count 使用了什么技术能做到秒级响应?
A: 我们使用了 Bitmap 技术,Bitmap 通常用于精确保存用户集合,它的存储空间比保存用户 ID 数组要小非常多倍,通常为了进一步节省空间,我们会使用 Roaring Bitmap 做压缩。Bitmap 不但可以精确去重,而且可以高效执行交集(and)、并集(or)运算,天然适合用户画像场景;目前在大多数传统数据库例如 mysql 等,大多没有实现 Bitmap。无法通过写 SQL 的方式使用 Bitmap 进行高效精确去重。

Q:除了 intersect_count,Kylin 还有哪些函数使用了 Bitmap 做加速?
A:intersect_count 是 Kylin 专有的扩展语法,使用的时候请参考 Kylin 官网说明使用。除了intersect_count,count distinct 和 intersect_value 也使用了 Bitmap。尤其要注意的是 intersect_count 也支持求并集,例如:当我们的过滤条件修改为(年龄在 ('21','19','20') 或者经过身份认证成功的)并且 (性别是 女的)用户。这个时候我们可以按照下面这种 SQL 语句来写:

select intersect_count(uid,label_name,array['age|credit_auth','gender']) from USER_ANALYSIS.BORROWER_LABEL_RAW_LONG  
where (label_name='age' and label_value in ('21','19','20'))
or (label_name='credit_auth' and label_value in ('成功认证'))
or (label_name='gender' and label_value in ('女'));

用户画像实践

Q:宽表是如何转为窄表的,Kylin 支持吗?
A:开源版和企业版都不包括宽表转窄表的功能。用户画像场景下,宽表转窄表的过程,是数据在进入 Kylin之前需要做的。可以直接通过 Hive HQL 实现,使用 LATERAL VIEW explode 就可以。或者如果你想实现复杂的转换逻辑,可以通过 UDTF 的方式完成。

Q:明细数据是存在哪里?如何查询的?
A:在我们的 Demo 中明细表是存在 HBase 中,查询明细时,通过 Kylin 筛选出目标用户 uid,然后使用 HBase API 根据 uid 去获取对应的明细。如果用户的 uid 不是 int 类型,需要在数据源中先转换成 int 类型。

Q:如果标签数据很多,且分布在多个不同的表中,最佳实践是什么样的?
A:建议将所有的标签合并在一张表中,使用一个 cube;如果放在不同 cube,需要开发额外函数进行 Bitmap 操作。

Q:如果输入标签值是连续值,有没有推荐的最佳实践?
A:如果类型为连续的,建议根据业务需求定义类似“本月消费额”、“本年消费额”这样的标签,并离散消费额(少于100,100-200...)来实现。对于时间类维度,可以采用单独作为一个维度来计算。

Q:在用户画像场景下,int 类型标签值为什么需要单独为一列?转换的步骤是怎样的?
A:由于 string 类型数字无法比较大小,所以我们需要将需要比较大小的列单独来做来。我们做用户圈选的时候,常见的一个需求是比较大小。例如我要筛选出金额大于100的用户。Hive 中默认保存的数据是 string 类型,string 类型的数字在比较大小的时候会出现跟预期不符合的情况【String 是按照字典顺序比较大小(依次比较ASCII码值),比如 "5" > "100"】。所以需要添加一个 int 或 double 类型标签字段,可以通过单独开发 UDTF 函数完成转化步骤。

其他问题

Q:Kylin 对 SQL 的语法解析是怎么解析的?
A:使用的是 Apache Calcite 作为 SQL 解析器。

Q:Kylin 支持准实时吗?如果支持,离线与实时数据如何合并?
A:Kylin 支持准实时,并且在 3.0 版本之后支持真实时,在准实时情况下和实时情况下的查询和正常的查询是一样的,Kylin 支持  lambda 架构,Kylin 内部会对实时和离线的结果做合并,用户不需要关心。

Q:Kylin 里面使用 Bitmap 有什么限制吗?
A:支持 int 表示的最大值 (22亿)个精确去重值,目前还不支持差集运算。

Q:如果 label_value 的基数很大,会出现问题吗?
A:一般标签值,都是经过范化并不会太多,要避免过度离散化。Kylin 如果使用字典编码的话,可以五百万个不同标签值,假设有一千个标签,那么平均一个标签可以有五千个值,是非常足够的。


添加企微

kyligence
关注我们

kyligence