使用布隆过滤器实现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;

    @Override
    public 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;
    }

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值