本文为您介绍在Hologres中如何通过宽表实现标签计算的最佳实践。

背景信息

离线数仓模型中,用户标签数据被分隔成面向主题、维度的多张表,这样的组织形式便于体系化的构建标签系统及数据维护管理。在线画像分析服务如果按照这样的数据模型组织标签数据,不可避免的需要Join多张标签表来完成多标签的过滤,这对于数据库产品开销太大。

方案介绍

Hologres标签宽表的方案是指将相对稳定的属性表离线聚合成宽表,将多张表的关联操作转化成对一张表的计算,新的标签列的场景可以通过增加列的方式实现,如下图所示。方案介绍这种方案适用于以下场景:
  • 标签数量较少(小于1000)。
  • 数据稳定(更新较少)。
将数据存在宽表中,多列之间过滤条件的与或非运算将被列存的优化机制自动处理,相比任何Join方式都要更加高效;另一方面,Hologres支持列式存储,不会产生IO放大的问题。使用宽表方案可沿用传统数据库模型建模和开发应用。

使用示例

使用标签宽表进行画像分析的示例如下,进行洞察dws_userbase表中[省份='浙江'] & [性别=男性]在已婚状态上的统计分析,示例SQL如下。建议根据查询方式对表设置合理的索引,以提升查询性能,详情请参见CREATE TABLE
-- 属性数据宽表
BEGIN;
CREATE TABLE dws_userbase
(
  uid text not null primary key,
  province text,
  gender text,
  married text
  ...             -- 其他属性列
);
call set_table_property('dws_userbase', 'distribution_key', 'uid');
call set_table_property('dws_userbase', 'bitmap_columns', 'province,gender,married');
END;

-- 洞察基础属性
SELECT count(distinct uid) as cnt,
       married
FROM dws_userbase ub
WHERE province = '浙江' and gender = '男'
GROUP BY married;