PostgreSQL\HybridDB for PG 毫秒级多维数据透视 案例分享

阅读原文请点击

摘要:标签 PostgreSQL , 数据透视 , 实时 , 物化 , 预计算 , 多维分析 , 流计算 , 增量合并 , 调度 , HLL 背景 典型的电商类数据透视业务,透视的语料可能会包含一些用户的标签数据:例如包含品牌的ID,销售区域的ID,品牌对应用户的ID,以及若干用户标签字段,时间字段等。

标签

PostgreSQL , 数据透视 , 实时 , 物化 , 预计算 , 多维分析 , 流计算 , 增量合并 , 调度 , HLL

背景

典型的电商类数据透视业务,透视的语料可能会包含一些用户的标签数据:例如包含品牌的ID,销售区域的ID,品牌对应用户的ID,以及若干用户标签字段,时间字段等。

标签可能会按不同的维度进行归类,例如tag1 性别,tag2 年龄段, tag3 兴趣爱好, ...。

业务方较多的需求可能是对自有品牌的用户进行透视,统计不同的销售区域(渠道)、时间段、标签维度下的用户数(一个非常典型的数据透视需求)。

例子

数据结构举例

每天所在区域、销售渠道的活跃用户ID

t1 (

uid,      -- 用户ID

groupid,  -- 销售渠道、区域ID

day        -- 日期

)

每个品牌的自有用户,维护增量

t2 (

uid,    -- 用户ID

pinpai  -- 品牌

)

用户标签,维护增量

t3 (

uid,    -- 用户ID

tag1,  -- 标签1,如兴趣

tag2,  -- 标签2,如性别

tag3,  -- 标签3,如年龄段

... ,

)

透视举例

对某品牌、某销售区域,某标签、某日进行透视。

例如

select

'兴趣' as tag,

t3.tag1 as tag_value,

count(1) as cnt

from

t1,

t2,

t3

where

t1.uid = t3.uid

and t1.uid = t2.uid

and t2.pinpai = ?

and t1.groupid = ?

AND t1.day = '2017-06-25'

group by t3.tag1

这类查询的运算量较大,而且分析师可能对不同的维度进行比对分析,因此建议采用预计算的方法进行优化。

预计算优化

预计算需要得到的结果如下:

t_result (

day,      -- 日期

pinpai,  -- 品牌ID

groupid,  -- 渠道、地区、门店ID

tag1,    -- 标签类型1

tag2,    -- 标签类型2

tag3,    -- 标签类型3

...      -- 标签类型n

cnt,      -- 用户数

uids,    -- 用户ID数组,这个为可选字段,如果不需要知道ID明细,则不需要保存

hll_uids  -- 用户HLL估值

)

对于GPDB,可以使用列存储,表分区则按day范围一级分区,按pinpai, groupid哈希进行二级分区,数据分布策略选择随机分布,最后针对每个tag?字段建立单独索引。 从而实现快速的检索(甭管数据量多大,单次透视请求的速度应该可以控制在100毫秒以内)。

得到这份结果后,分析师的查询简化如下(前三个条件通过分区过滤数据,最后根据tag?的索引快速得到结果):

select

day, pinpai, groupid, 'tag?' as tag, cnt, uids, hll_uids

from t_result

where

day =

and pinpai =

and groupid =

and tag? = ?

预计算后,甚至能以非常少量的运算量,实现更加复杂的维度分析,例如分析某两天的差异用户,分析多个TAG叠加的用户等

预计算的方法

产生统计结果的SQL如下

select

t1.day,

t2.pinpai,

t1.groupid,

t3.tag1,

t3.tag2,

t3.tag3,

...

count(1) as cnt ,

array_agg(uid) as uids,

hll_add_agg(hll_hash_integer(uid)) as hll_uids

from

t1,

t2,

t3

where

t1.uid = t3.uid

and t1.uid = t2.uid

group by

t1.day,

t2.pinpai,

阅读原文请点击

你可能感兴趣的:(PostgreSQL\HybridDB for PG 毫秒级多维数据透视 案例分享)