python 获取多个HLL并集的Aerospike hyperLogLog(HLL)交集计数

bnl4lu3b  于 2023-02-11  发布在  Python
关注(0)|答案(1)|浏览(155)

我有两个或多个被联合的HLLs,我想得到联合的交集计数。我使用了这里的例子hll-python example以下是我的代码

ops = [hll_ops.hll_get_union(HLL_BIN, records)]
_, _, result1 = client.operate(getKey(value), ops)

ops = [hll_ops.hll_get_union(HLL_BIN, records2)]
_, _, result2 = client.operate(getKey(value2), ops)

ops = [hll_ops.hll_get_intersect_count(HLL_BIN, [result1[HLL_BIN]] + [result2[HLL_BIN]])]
_, _, resultVal = client.operate(getKey(value), ops)
print(f'intersectAll={resultVal}')
_, _, resultVal2 = client.operate(getKey(value2), ops)
print(f'intersectAll={resultVal2}')

当我使用hll_get_intersect_count为交集使用不同的键时,我得到了2个不同的结果,即resultVal和resultVal2不相同。这在使用函数hll_get_union_count进行联合计数的情况下不会发生。理想情况下,交集的值应该相同。
有谁能告诉我为什么会发生这种情况,什么是正确的做法?

8aqjt8rx

8aqjt8rx1#

能够找出解决方案(在Aerospike支持的帮助下,同样的问题被张贴在这里,并进行了更详细的讨论aerospike forum)。
发布我的代码为其他人有同样的问题。
Aerospike中不支持HLL的交集。但是,如果要获得多个HLL的交集,我必须将一个并集保存到Aerospike中,然后获得一个与并集的其余部分的交集计数。我们在client.operate函数中为hll_get_intersect_count提供的键用于获得与并集的交集。
下面是我编写的代码

ops = [hll_ops.hll_get_union(HLL_BIN, records)]
_, _, result1 = client.operate(getKey(value), ops)

# init HLL bucket
ops = [hll_ops.hll_init(HLL_BIN, NUM_INDEX_BITS, NUM_MH_BITS)]
_, _, _ = client.operate(getKey('dummy'), ops)
# get set union and insert to inited hll bucket and save it for 5 mins(300 sec)
# use hll_set_union to save the HLL into aeropike temporarily
ops = [hll_ops.hll_set_union(HLL_BIN, [records2])]
_, _, _ = client.operate(getKey('dummy'), ops, meta={"ttl": 300})

ops = [hll_ops.hll_get_intersect_count(HLL_BIN, [result1[HLL_BIN]])]
_, _, resultVal = client.operate(getKey('dummy'), ops)
print(f'intersectAll={resultVal}')

有关更多参考,可以在此处查找hll_set_union reference
更多详细讨论可在此处找到

相关问题