统计近n天不重复的数据:
HBase表结构设计:
- A表存储所有的数据信息,记录数据最新的时间;
- B表记录近n天的案件进件数;
例如:案件x的进件时间分别为5/1、5/2、5/4
进件号 | 进件时间 |
---|---|
x | 5/1 |
x | 5/2 |
x | 5/4 |
表A、B的记录变化如下
1、2、3、4列表示当日与其相差n天的重复案件数
下面演示进件后表A、B的变化
5/1 日进件后表记录如下:
表A:
进件号 | 进件时间 |
---|---|
x | 5/1 |
表B:
进件号 | 进件时间 | 当日进件总数 | 1 | 2 | 3 | 4 |
---|---|---|---|---|---|---|
x | 5/1 | 1 | 0 | 0 | 0 | 0 |
5/2进件后表记录如下:
表A:
进件号 | 进件时间 |
---|---|
x | 5/2 |
表B:
进件号 | 进件时间 | 当日进件总数 | 1 | 2 | 3 | 4 |
---|---|---|---|---|---|---|
x | 5/1 | 1 | 0 | 0 | 0 | 0 |
x | 5/2 | 1 | 1 | 0 | 0 | 0 |
注:1列数字加1,5/2与5/1有重复数据一条
5/3无进件后表记录如下:
表A:
进件号 | 进件时间 |
---|---|
x | 5/2 |
表B:
进件号 | 进件时间 | 当日进件总数 | 1 | 2 | 3 | 4 |
---|---|---|---|---|---|---|
x | 5/1 | 1 | 0 | 0 | 0 | 0 |
x | 5/2 | 1 | 1 | 0 | 0 | 0 |
x | 5/3 | 0 | 0 | 0 | 0 | 0 |
5/4进件后表记录如下:
表A:
进件号 | 进件时间 |
---|---|
x |
表B:
进件号 | 进件时间 | 当日进件总数 | 1 | 2 | 3 | 4 |
---|---|---|---|---|---|---|
x | 5/1 | 1 | 0 | 0 | 0 | 0 |
x | 5/2 | 1 | 1 | 0 | 0 | 0 |
x | 5/3 | 0 | 0 | 0 | 0 | 0 |
x | 5/4 | 1 | 0 | 1 | 0 | 0 |
表A由5/2改为5/4,相差2天,因此2列加1
最后假设统计近三天的进件总数:
取表B
进件号 | 进件时间 | 当日进件总数 | 1 | 2 | 3 | 4 |
---|---|---|---|---|---|---|
x | 5/1 | 1 | 0 | 0 | 0 | 0 |
x | 5/2 | 1 | 1 | 0 | 0 | 0 |
x | 5/3 | 0 | 0 | 0 | 0 | |
x | 5/4 | 1 | 0 | 0 |
如图,加粗的数据就是3天内的进件总数,做删除标记的就是近三天的重复案件数。
计算近n天的数据,可以根据表结构追溯历史数据,但是计算的时间复杂度为O(n^2),所以结合下面的设计,就可以得到很好的优化:
表A的设计不变,表B增加一列,变化如下:
进件号 | 进件时间 | 当日进件数 |
---|---|---|
x | 5/1 | 1 |
进件号 | 进件时间 | 当日进件数 |
---|---|---|
x | 5/1 | |
x | 5/2 | 1 |
进件号 | 进件时间 | 当日进件数 |
---|---|---|
x | 5/1 | |
x | 5/2 | 1 |
x | 5/3 | 0 |
进件号 | 进件时间 | 当日进件数 |
---|---|---|
x | 5/1 | |
x | 5/2 | |
x | 5/3 | 0 |
x | 5/1 | 1 |
结合上面的设计,统计近n天的时间复杂度为O(n)
结合上面的两种思路,就能使数据去重的计算得到很好的优化