在前边介绍时序数据的时候, 我们可能经常会遇到计算基数(Cardinality) 和分位数 (Quantile)。 基数我们可以理解为 count distinct。比如计算页面访问的独立ip, 分位数我们举个我们最常用的第99百分位数例子, 假设我说中国人寿命的第99百分位数是101岁, 这个表示, 99%的中国人的寿命不会超过101岁。
我们看看基数怎么计算。 假设我们要统计独立ip, 则我们需要一行行读入访问日志, 找到对端ip, 然后在内存里建一个map或者set, 测试这个ip是否已经存在, 如果不存在则插入。 最后统计map或者set的元素。 这个方法虽然很准确, 但是要消耗大量的内存。 其实在现实应用中, 这个数据往往允许一定范围的误差, 所以我们可以用统计方法来计算这个基数。 思路如下,首先我们把ip地址用一个哈希函数均匀的分散到 一个很大的范围上, 然后再把哈希后的值映射到一组(比如1k个)bucket中。 每个bucket只需要一个bit表示。 如果有数据映射到这个bucket 则标记为1 否则标记为0. 现在假设访问请求都是特定的几个ip产生的, 则在我们的bucket中, 大量bit都是0. 如果访问请求来自众多的不同的ip, 则大量bit位被置1. 所以通过被置1的bit的多少就能估算出独立ip的数量。
上面我只介绍一个基本原理, 详细的算法请自行翻看论文。
在时序数据处理中, 类似上面这种估算算法被大量使用,一般