使用Feapder中的Dedup过滤数据
Dedup 简介
Dedup 是 feapder 大数据去重模块,不同于 BloomFilter,去重受槽位数量影响,Dedup 使用了弹性的去重机制,可容纳海量的数据去重。
过滤数据
import random
from feapder.dedup import Dedupdef generate_datas():# 生成一个包含 100 个随机数的列表all_numbers = list(range(1, 101))random.shuffle(all_numbers) # 打乱顺序# 从打乱后的列表中选择前 50 个数作为 data1datas1 = all_numbers[:50]# 从剩下的 50 个数中选择 20 个数作为 data2 的一部分remaining_numbers = all_numbers[50:]datas2_part1 = remaining_numbers[:20]# 从 data1 中选择 30 个数添加到 data2 中datas2_part2 = random.sample(datas1, 30)# 合并 data2 的两个部分datas2 = datas2_part1 + datas2_part2# 找出在 data2 中但不在 data1 中的数据datas3 = [num for num in datas2 if num not in datas1]# 打印结果print("datas1:", datas1)print("datas2:", datas2)print("对照组数据:", datas3)return datas1, datas2def test_filter(datas1, datas2):dedup = Dedup(Dedup.BloomFilter, redis_url="redis://user:password@localhost:6379/0")# 添加数据dedup.add(datas1)# 过滤掉已存在数据dedup.filter_exist_data(datas2)# 打印剩余数据print(f"去重后数据:{datas2}")if __name__ == "__main__":datas1, datas2 = generate_datas()test_filter(datas1, datas2)
Dedup参数
filter_type
:去重类型,支持 BloomFilter、MemoryFilter、ExpireFilter、LiteFilter 四种name
:过滤器名称,该名称会默认以 dedup 作为前缀dedup:expire_set:[name]
或dedup:bloomfilter:[name]
。 默认ExpireFilter name=过期时间; BloomFilter name=dedup:bloomfilter:bloomfilter
,若对不同数据源去重,可通过 name 参数来指定不同去重库absolute_name
: 过滤器绝对名称 不会加 dedup 前缀,当此值不为空时 name 参数无效expire_time
: ExpireFilter 的过期时间,单位为秒,其它过滤器不用指定error_rate
: BloomFilter / MemoryFilter 的误判率,默认为 0.00001to_md5
: 去重前是否将数据转为 MD5,默认是redis_url
:redis://[[username]:[password]]@localhost:6379/0
- BloomFilter 与 ExpireFilter 使用
- 默认会读取 setting 中的 redis 配置,若无 setting,则需要专递 redis_url
initial_capacity
: 单个布隆过滤器去重容量,默认 100000000,当布隆过滤器容量满时会扩展下一个布隆过滤器