排重客户数&日排重客户数

区别

假设查询时间区间为:20190101-20190102

  • 排重客户数:distinct(20190101,20190102)
  • 日排重客户数:distinct(20190101)+distinct(20190102)

固定时间区间的查询

例如周维度、月维度的查询,我们可以通过bitmap的方式,对用户id进行聚合,占用空间小,合并速度快

对于排重客户数来说:直接在etl中进行周和月的聚合即可,最终每周或者每月只是对应一个bitmap

但是对于日排重客户数来说,由于是日的排重客户数求和,所以计算的时候,需要计算天的结果再求和,月的需要请求30次,性能肯定一般。

解决方案

日排重客户数通过某种方式也可以实现周或者月维度的聚合,只要让相同的用户id在不同天是不同的就行了。

所以将原来的客户id跟日期组合,映射成新的用户id

customerid date date_cust
100 20190101 1 100
101 20190113 13 100

将这个新的用户id生成bitmap,就可以月聚合了。

注意

这个新的id的生成方案,相当于在用户id前面拼接了日期信息,如果用户id很大,拼接上日期信息之后生成的数字可能超过了int最大值,目前的bitmap好像仅支持int类型的最大值。

优化方案

将用户id前面拼接上日期之后,对这个日客户id字段进行distinct,然后从头开始分配一个顺序编号,这样能生成一个紧密的连续的日用户id,减少日期和用户id组合之后生成的新的id溢出int最大值的可能性。

customerid date date_cust bitmap_id
100 20190101 1 100 1
101 20190113 13 100 2