关于HyperLogLog去重优化_pucheung的博客-程序员秘密


点击箭头处“蓝色字”,关注我们哦!!

推荐阅读

1

Flink去重第一弹:  MapState去重 

2

Flink去重第二弹:SQL方式 

3

Flink去重第三弹:HyperLogLog去重

在HyperLogLog去重实现中,如果要求误差在0.001以内,那么就需要1048576个int, 也就是会消耗4M的存储空间,但是在实际使用中有很多的维度的统计是达不到这个数据量,那么可以在这里做一个优化,优化方式是:初始HyperLogLog内部使用存储是一个set集合,当set大小达到了指定大小(1048576)就转换为HyperLogLog存储方式。这种方式可以有效减小内存消耗。

实现代码:

public class OptimizationHyperLogLog {
    //hyperloglog结构
    private HyperLogLog hyperLogLog;
    //初始的一个set
    private Set<Integer> set;
     
    private double rsd;
    
    //hyperloglog的桶个数,主要内存占用
    private int bucket;


    public OptimizationHyperLogLog(double rsd){
        this.rsd=rsd;
        this.bucket=1 << HyperLogLog.log2m(rsd);
        set=new HashSet<>();      
       }


   //插入一条数据
    public void offer(Object object){
        final int x = MurmurHash.hash(object);
        int currSize=set.size();
        if(hyperLogLog==null && currSize+1>bucket){ 
           //升级为hyperloglog
           hyperLogLog=new HyperLogLog(rsd);
           for(int d: set){
               hyperLogLog.offerHashed(d);
           }
           set.clear();
        }


        if(hyperLogLog!=null){
            hyperLogLog.offerHashed(x);
        }else {
            set.add(x);
        }
    }


    //获取大小
    public long cardinality() {
      if(hyperLogLog!=null) return hyperLogLog.cardinality();
      return set.size();
    }
}

初始化:入参同样是一个允许的误差范围值rsd,计算出hyperloglog需要桶的个数bucket,也就需要是int数组大小,并且初始化一个set集合hashset;

数据插入:使用与hyperloglog同样的方式将插入数据转hash, 判断当前集合的大小+1是否达到了bucket,不满足则直接添加到set中,满足则将set里面数据转移到hyperloglog对象中并且清空set, 后续数据将会被添加到hyperloglog中;

这种写法没有考虑并发情况,在实际使用情况中也不会存在并发问题。

—END—

关注回复Flink

获取更多系列

好看,就要点个"在看"

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/u013516966/article/details/103867204

智能推荐

linux-6.5下 基于vsftpd+pam+mysql的配置解析_wocaoliude的博客-程序员秘密

网络共享文件系统基于pam-mysql实现认证(这个是第三方的认证),以及mysql数据库的结合使用,可以限定指定用户的登录,ftp等权限;

2021Java开发社招面试解答之性能优化,全网最新_程序员呼呼的博客-程序员秘密

前言前段时间发放了学习资料给予自学java的同学们,自学虽好,但是架不住没有老师讲解重侧点(实际上许多培训班的老师也是水分多多,甚至无实战经验),今天我就抽空把java零基础入门(六个月)的学习重点画出来,在不影响达到工作和进阶的前提下删繁就简!去掉不必要的注水内容!常见的分布式事务场景分布式事务其实就在我们身边,你一直在用,但是你却一直不注意它。转账扣你账户的余额,增加别人账户余额,如果只扣了你的,别人没增加这是失败;如果没扣你的钱别人也增加了那银行的赔钱。下订单/扣库存电商系统中这是很常

将计算机运用于办公自动化,计算机信息处理技术在办公自动化中的应用_佛玉花缘的博客-程序员秘密

白洁摘 要 随着时代的发展,科学技术的不断进步,尤其是计算机技术的不断提升,对于各行各业的发展都是产生了重要的影响。尤其是,在我国的改革开放不断深入,企业在生产经营的过程中需要面对剧烈的市场竞争,需要对于从市场中获得的巨量信息进行处理,传统的的信息处理技术很难满足企业在当前竞争环境下的需求,计算机信息处理技术的性能和效率不断提升,因此,在我国办公自动化,企业信息、数据分析中计算机处理技术发挥了重要...

深入理解mongo中的数据类型,了解Mongo的Id生成策略_坐等故国扶风起的博客-程序员秘密_mongodb id设计策略

mongoDB的document与javaScript中对象类似,document类似JSON, 但是 JSON本身有一些局限性, 比如JSON数据类型相对较少, 没有日期类型;只有一种数字类型,无法区分浮点和整数,无法表示通用类型,比如正则表达式或者函数MongoDB中,document在保留JSON key-value的基础上,添加了一些数据类型 ,下面就展开说一下,mongo中的基本数据...

java获取中文的拼音以及获取中文拼音的首字母_羸鹄丶的博客-程序员秘密_java 获取中文拼音首字母

首先在pom文件中引入依赖 pinyin4j &amp;lt;dependencies&amp;gt; &amp;lt;dependency&amp;gt; &amp;lt;groupId&amp;gt;com.belerweb&amp;lt;/groupId&amp;gt; &amp;lt;artifactId&amp;gt;pinyin4j&amp;lt;/artifactId&amp;gt; ...

java版我的世界免费获取,持续更新~_aifans_bert的博客-程序员秘密

我的世界:Java版将与基岩版"地形"生成统一!1.18的隐藏更新!保持了JAVA版一致?事实上若你足够了解JAVA版的种子,你会发现其实很多不同的种子代码,会得到的是一个完全一致的世界。 04问题四:未来 未来JAVA版我的世界,和基岩版的Minecraft,它们真的可能变得完全一致! 05问题五:Mojang为什么要让地形统一? 一直以来,基岩版最大的魅力就。我的世界:java版免费披风,账号迁移轮到我了,快来看看怎么操作导致启动器显示我没有购买Minecraft,只有试玩资格。只有你选择微软账

随便推点

Linux程序coredump地址显示问号的调试方法 - 基于map文件_../sysdeps/unix/sysv/linux/raise.c: no such file o_WindLOR的博客-程序员秘密

coredump即Linux系统上,应用程序崩溃时的运行栈快照,已便于定位崩溃问题正确使用coredump需要几个条件:第一,coredump本身的配置设置coredump文件路径及名称 echo "$dir/core-%e-%p-%t" &gt; /proc/sys/kernel/core_pattern记录pid echo 1 &gt; /proc/sys/kernel/core_uses_pid设置coredump文件大小:ulimit -c unlimited

【代码】PHP的json_encode详解分析_u012275531的博客-程序员秘密

json的优点就不说了,有个习惯,我在输出json的时候,喜欢用 sprintf 拼成json格式,前两天被朋友说不标准,必须要用json_encode生成的才是标准的json格式,我当然很郁闷啦,用了这么多年了,刚知道 这样做不标准,既然说我不标准,那上面才是标准的json格式?{a : 'abc'}{'a' : 'abc'}{a : "abc

springboot集成邮件服务_lilianggui的博客-程序员秘密

本文介绍springboot使用javamail使用qq邮箱发送普通邮件0、常用的邮件协议:SMTP、POP3、IMAP、Mime1、依赖导入&lt;dependency&gt; &lt;groupId&gt;org.springframework.boot&lt;/groupId&gt; &lt;artifactId&gt;spring-boot-starter-m...

无线网460王者荣耀服务器,王者荣耀:网络460真实原因已查清,别再怪天美了!..._weixin_39968861的博客-程序员秘密

原标题:王者荣耀:网络460真实原因已查清,别再怪天美了!王者荣耀作为一款5v5公平手游,至今也是有了三年的时间了。不得不说,在如今竞争激烈的现实社会中,一款手游能火3年也确实是有它的价值所在的。很多人都已经把王者荣耀作为一项休闲娱乐的最佳方式了,在空闲时间,找几个朋友来打局王者荣耀也确实是非常有意思的。 不过呢,很多玩家在打王者荣耀的时候都会遇到一件很头疼的事情,那就是网络460。什么是网络46..._1671465600

SparkRDD讲解_DaftCat的博客-程序员秘密

       RDD(resilient distributed dataset)弹性分布式数据集,这个数据集可以缓存在内存中,在多级计算间重用。在抽象上来说,它是一个可分区的数据集,不同的分区分布在不同的worker节点上。它的数据默认是存储在内存中的,当内存不足时,会将数据写入磁盘。       RDD的容错性是很重要的,如果某个节点上的RDD partition数据丢失,那么RDD会根据...

java与js的instanceof与typeof的使用_wespten的博客-程序员秘密_java中的typeof

java instanceof 用来测试一个对象是否为一个类的实例,能不能转为某个类的对象。用法为:boolean result = obj instanceof Class其中 obj 为一个对象,Class 表示一个类或者一个接口,当 obj 为 Class 的对象,或者是其直接或间接子类,或者是其接口的实现类,结果result 都返回 true,否则返回false。  注意...

推荐文章

热门文章

相关标签