使用Python SDK通过前缀扫描Bigtable

时间:2019-05-27 16:45:32

标签: python google-cloud-bigtable happybase

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

1 个答案:

答案 0 :(得分:1)

read_rows方法具有两个参数start_keyend_key,可用于基于行键有效地过滤行(请参阅{{3} }。在后台,此方法执行扫描,因此这就是为什么这可能是基于行键筛选行的最有效方法。

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

a
aa
b
bb
bbb

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

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

这将仅扫描ab之间的行(不包括b),因此它将返回所有行键前缀为aa的行和上一个示例中的aa