前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >hyperloglog的java版使用

hyperloglog的java版使用

作者头像
code4it
发布2018-09-17 14:42:28
1.4K0
发布2018-09-17 14:42:28
举报
文章被收录于专栏:码匠的流水账码匠的流水账

对于海量数据来说,数据内存占用会变得很高. Probabilistic数据结构牺牲了一下准确率去换取更低内存占用。比如一个HyperLogLog的数据结构只需要花费12KB内存,就可以计算接近2^64个不同元素的基数,而错误率在1.625%.

场景

HyperLogLog一个常用的场景就是统计网站的UV。

基数

简单来说,基数(cardinality,也译作势),是指一个集合(这里的集合允许存在重复元素)中不同元素的个数。例如看下面的集合: {1,2,3,4,5,2,3,9,7} 这个集合有9个元素,但是2和3各出现了两次,因此不重复的元素为1,2,3,4,5,9,7,所以这个集合的基数是7。

maven

代码语言:javascript
复制
        <dependency>
            <groupId>net.agkn</groupId>
            <artifactId>hll</artifactId>
            <version>1.6.0</version>
        </dependency>

使用

代码语言:javascript
复制
    @Test
    public void testSimpleUse(){
        final int seed = 123456;
        HashFunction hash = Hashing.murmur3_128(seed);
        // data on which to calculate distinct count
        final Integer[] data = new Integer[]{1, 1, 2, 3, 4, 5, 6, 6,
                6, 7, 7, 7, 7, 8, 10};
        final HLL hll = new HLL(13, 5); //number of bucket and bits per bucket
        for (int item : data) {
            final long value = hash.newHasher().putInt(item).hash().asLong();
            hll.addRaw(value);
        }
        System.out.println("Distinct count="+ hll.cardinality());
    }

原理

设想成一次不断投硬币的过程,非正面即反面(每一面的概率为0.5)。 在这个过程中,投掷次数大于k的概率是0.5^k(连续投掷出k个反面),在一次过程中,投掷次数小于k的概率是(1-0.5)^k。 因此,在n次投掷过程中,投掷次数均小于k的概率是

代码语言:javascript
复制
P(x<=k)=(1-0.5^k)^n  
P(x>=k)=1-(1-0.5^k)^n

从以上公式,可以看出,当n<=k)的概率,接近为0。而当n>>k时,P(x<=k)的概率接近为0。所以,当n>>k时,没有一次投掷次数大于k的概率几乎为0。

将一次过程,理解成一个比特子串,反面为0,正面为1, 投掷次数k对应第一个1出现的位置,当统计子串足够多时,其最大的第一个1的位置为j,那么当n>>2^j时,P(x<=k)接近为0,当n<<2^j时,P(x>=0)也趋向为0。也就是说,在得到x=k的前提下,我们可以认为n=2^j。

再通俗点说明: 假设我们为一个数据集合生成一个8位的哈希串,那么我们得到00000111的概率是很低的,也就是说,我们生成大量连续的0的概率是很低的。生成连续5个0的概率是1/32,那么我们得到这个串时,可以估算,这个数据集的基数是32。

doc

  • HyperLogLog的核心思想原理
  • Probabilistic data Structures – Bloom filter and HyperLogLog for Big Data
  • HyperLogLog: 解读Cardinality Estimation算法(第一部分:基本概念)
本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2017-08-07,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 码匠的流水账 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 场景
  • 基数
  • maven
  • 原理
  • doc
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档