1

我正在尝试使用 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。第一个查询涉及多个前缀,它似乎不支持在同一个请求中进行多个过滤,所以我执行的请求与前缀一样多,然后连接迭代器。另外两个似乎利用了前缀过滤器。

更新:我第一次删除是因为环境出错。正确执行后,范围查询的时间还不错,但似乎还有改进的余地,因为 Happybase 测试在利用前缀搜索时仍然更快。

希望能帮助您在 Happybase 中使用多个前缀搜索,或在主要 Python SDK 中使用实际前缀搜索。

4

1 回答 1

3

read_rows方法有两个参数start_keyend_key您可以使用它们根据行键有效地过滤行(请参阅文档)。在幕后,此方法执行扫描,因此这可能是基于行键过滤行的最有效方法。

例如,假设您的表中有以下行键:

a
aa
b
bb
bbb

并且您想检索带有前缀的行键的所有行a,您可以运行:

rows_with_prefix_a = my_table.read_rows(start_key="a", end_key="b")

这将只扫描abb排除)之间的行,因此这将返回所有带有行键前缀的行aaaa前面的例子)。

于 2019-05-28T10:44:30.860 回答