Aerospike HLL并集交集计数异常:不同Key调用结果不一致求助
HLL交集计数结果不一致的原因及正确做法
问题原因
你当前的代码逻辑存在核心错误:
hll_get_intersect_count的作用是计算当前操作的Key对应的HLL Bin,与传入的HLL集合之间的交集基数- 第一次调用
operate(getKey(value), ops)时,计算的是getKey(value)对应的HLL与[result1[HLL_BIN], result2[HLL_BIN]]的交集;第二次调用operate(getKey(value2), ops)时,计算的是getKey(value2)对应的HLL与同一组HLL的交集。两次计算的基准HLL完全不同,结果自然不一致。 - 你实际需求是计算
result1和result2这两个合并后HLL的交集计数,但当前代码完全偏离了这个目标。
另外补充:hll_get_union_count结果一致只是巧合——如果getKey(value)和getKey(value2)对应的HLL本身是空的,那两次计算的都是result1和result2的并集计数;但如果这两个Key的HLL有数据,结果也会出现差异,本质上你的并集计算逻辑同样存在漏洞。
正确做法
要计算多个独立HLL的交集基数,推荐两种可行方式:
方式1:使用临时Key存储基准HLL
先将其中一个目标HLL存入临时Key,再以此为基准计算与其他HLL的交集:
# 定义临时Key temp_key = "temp_hll_intersect" # 将result1存入临时Key的HLL Bin client.put(temp_key, {HLL_BIN: result1[HLL_BIN]}) # 计算临时HLL与result2的交集计数 ops = [hll_ops.hll_get_intersect_count(HLL_BIN, [result2[HLL_BIN]])] _, _, intersect_result = client.operate(temp_key, ops) print(f'intersect_count={intersect_result}') # 清理临时Key(可选) client.remove(temp_key)
方式2:基于已有Key的HLL直接计算
如果result1是getKey(value)的HLL与records的并集,可先将并集结果保存到原Key,再以此为基准计算与result2的交集:
# 先将getKey(value)的HLL与records合并并保存到原记录 ops = [hll_ops.hll_set_union(HLL_BIN, records)] client.operate(getKey(value), ops) # 计算该记录的HLL与result2的交集计数 ops = [hll_ops.hll_get_intersect_count(HLL_BIN, [result2[HLL_BIN]])] _, _, intersect_result = client.operate(getKey(value), ops) print(f'intersect_count={intersect_result}')
内容的提问来源于stack exchange,提问作者darekarsam
相关产品推荐
相关产品推荐

