使用 Python 个 SDK 按前缀扫描 Bigtable

Scanning Bigtable by prefix with Python SDKs

我正在尝试使用 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 中使用实际前缀搜索的帮助。

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

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

a
aa
b
bb
bbb

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

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

这将只扫描 ab 之间的行(b 除外),因此这将 return 行键前缀为 a 的所有行(上例中的 aaa)。