HiveSQL实战积累_多个去重指标用户id列与加和数据共同存储
1.背景
在线数据引擎主要存储两种数据:预计算数据和明细数据,但是实际上有一些实际应用场景需要在这中间做一些均衡。比如最典型的行业模块数据,以同样一份成交底表明细数据为数据源,需要展示类目、品牌、店铺等不同维度的数据。如果完全使用预计算,需要预计算的维度有些多,而且只能限定预计算时间维度,无法进行自定义时间查询;如果使用明细数据做olap数据量又太大了,会造成线上查询性能差。于是想到一个折中的办法就是进行明细上卷,将数据聚合到能满足查询条件的最大粒度。
进行数据上卷要考虑的主要有两类数据,一类是可加和数据,如pv、成交金额等,计算大粒度数据时可以直接将小粒度数据加和得到;还有一类是去重数据,如uv、成交客户数、加购客户数等,这一类数据在做上卷时不能直接计算出结果,需要保留原始数据以便在任意维度做去重聚合计算。
在上卷时保留去重指标原始数据的方式,常见的有bitmap存储、ck物化视图,现在介绍一种比较原始,没那么节约存储方法。
2.SQL实例
基于明细数据将可加和数据按sku粒度聚合计算保存,将去重指标数据按用户id+sku粒度group by保存,然后将可加和指标的聚合计算结果插入非去重指标数据的某一行。这种方案还可以将多个不同的去重指标数据存储在同一个表的同一行中。
1 | SELECT |
知识要点:上述实例巧妙的使用一个rank_flag先将不同指标的用户id关联到同一行中,尽可能的减少行数,使得一个sku存储的行数就是用户id最多的那个指标的用户id数,然后又用这个rank_flag将可加和指标数据存放到其中一行中去,仅可能的节约了存储。