我正在尝试使用Python SDK在Google Cloud Bigtable上通过多个前缀执行搜索。我正在使用read_rows
,但找不到通过前缀进行明确搜索的好方法。
我的第一个选择是RowSet
+ RowRange
。我正在测试三个查询,得到的时间是〜1.5s,〜3.5s和〜4.2s,这比使用Node SDK(带有过滤器)的搜索要慢一个数量级。选项)〜0.19,〜0.13,〜0.46。
第二个选项是使用RowFilterChain
+ RowKeyRegexFilter
。对于以下两个频率而言,性能非常糟糕:〜3.1s,〜70s,〜75s 〜0.124s,〜72s,〜69s。看起来它正在进行全面扫描。这是代码部分:
regex = f'^{prefix}.*'.encode()
filters.append(RowKeyRegexFilter(regex))
我的第三个选择是使用替代的基于Happybase的SDK,该软件具有前缀过滤功能。这样,我得到〜36s,〜3s,〜1s 〜0.4,〜0.1,〜0.17。第一个查询涉及多个前缀,并且在同一请求中似乎不支持多个过滤,因此我要执行与前缀一样多的请求,然后将迭代器串联起来。另外两个似乎利用了前缀过滤器。
UPDATE :我第一次删除是因为环境有误。正确执行之后,范围查询的时间还算不错,但似乎仍有改进的空间,因为当使用前缀搜索时,Happybase测试仍然更快。
将感谢您提供有关在Happybase中使用多个前缀搜索或在主Python SDK中使用实际前缀搜索的帮助。
答案 0 :(得分:1)
read_rows
方法具有两个参数start_key
和end_key
,可用于基于行键有效地过滤行(请参阅{{3} }。在后台,此方法执行扫描,因此这就是为什么这可能是基于行键筛选行的最有效方法。
例如,假设您的表中有以下行键:
a
aa
b
bb
bbb
,并且要检索所有以行a
为前缀的行,则可以运行:
rows_with_prefix_a = my_table.read_rows(start_key="a", end_key="b")
这将仅扫描a
和b
之间的行(不包括b
),因此它将返回所有行键前缀为a
(a
的行和上一个示例中的aa
。