当前位置: 首页 > ops >正文

使用布隆过滤器实现java大数据筛选是否存在

问题
两组大量的数据集合想要互相对比是否一致,而且两组大数据内有多字段。

解决思路
根据多字段生成json,再根据json生成md5,存入布隆过滤器中,每次根据md5查询布隆过滤器内是否存在,不存在直接跳过,存在可能有误判率,需要对比md5是否一致,项目启动初始化加载布隆过滤器,服务器服务器若是重启,内部业务加载已存在的md5存入布隆过滤器中,其他业务代码对比若没有存入,下面是代码

根据需要生成json的几个字段生成json串

public String toJson(String name, BigDecimal amount, Date dateTime, Date effectDate, BigDecimal money) {SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy-MM-dd");SimpleDateFormat sdf2 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");String amountToString = null;if(amount != null){amountToString = String.valueOf(amount);}return String.format("{\"name\":\"%s\",\"amount\":%s,\"dateTime\":\"%s\",\"money\":%.2f}",name,amountToString,dateTime != null ? sdf2.format(dateTime) : null,money != null ? money : null);
}

生成md5

import org.apache.commons.codec.digest.DigestUtils;public class JsonMD5Generator {public static String generateMD5(String jsonString) {return DigestUtils.md5Hex(jsonString);}
}

布隆过滤器,项目启动时加载,里面可以写自己的业务

import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
import com.google.common.hash.BloomFilter;
import lombok.extern.slf4j.Slf4j;
import org.springframework.boot.CommandLineRunner;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;import java.util.ArrayList;
import java.util.List;@Slf4j
@Component
@Order(1)
public class BloomFilterInitializer implements CommandLineRunner {private BloomFilter<String> bloomFilter;@Overridepublic void run(String... args) throws Exception {log.info("布隆过滤器初始加载开始");// 预计元素数量long expectedInsertions = 1000000L;// 误判率double fpp = 0.01;// 初始化布隆过滤器bloomFilter = BloomFilter.create(Funnels.stringFunnel(StandardCharsets.UTF_8),expectedInsertions,fpp);// 加载数据loadData();log.info("布隆过滤器初始加载结束");}private void loadData() {// 数据加载逻辑}public BloomFilter<String> getBloomFilter() {return bloomFilter;}}
http://www.xdnf.cn/news/7580.html

相关文章:

  • 如何解决虚拟机中U盘无法识别的问题
  • 抖音视频如何下载保存?高清无水印一键保存到手机!
  • 基于Gitee 的开发分支版本管理规范
  • 视频监控联网系统GB28181协议中互联结构详解
  • AI大模型应用微调服务商分享:微调技术Lora和SFT的异同
  • 8 定时任务与周期性调度
  • 小红书“开门”,摸到电商金钥匙?
  • Linux(3)——基础开发工具
  • langchain 实现 任务分解器
  • 深度学习中的正则化方法与卷积神经网络基础
  • leetcode hot100:三、解题思路大全:哈希(两数之和、字母异位词分组、最长连续序列)、双指针(移动零、盛最多水的容器、三数之和、接雨水)
  • beanstalk一直被重新保留(reserved 状态)消息删除
  • BACnet协议详解:架构、应用、挑战与未来发展
  • WIFI信号状态信息 CSI 深度学习之数据集
  • 基于自然语言转SQL的BI准确率如何?
  • C语言指针深入详解(四):指针变量、二维数组传参的本质、函数指针数组、转移表
  • FastDatasets新功能,让模型学会“思考”!
  • 双指针法高效解决「移除元素」问题
  • python学习打卡day31
  • vue+springboot+element-ui实现table的树懒加载
  • 【windows】音视频处理工具-FFmpeg(合并/分离)
  • SpringCloud+Vue实现大文件分片下载(支持开始、暂停、继续、取消)
  • 微店商品详情接口开发指南
  • 创建thinkphp项目并配置数据库
  • 策略梯度方法(Policy Gradient Methods)
  • 物流项目第四期(运费模板列表实现)
  • 电网中窃电分析:概念、算法与应用
  • uview 2.x 下载安装配置 border=“surround“ 不生效
  • STM32+ESP8266+ONENET+微信小程序上传数据下发指令避坑指南
  • Python Selenium 使用指南