【问题标题】:Scanning Bigtable by prefix with Python SDKs使用 Python SDK 按前缀扫描 Bigtable
【发布时间】:2019-10-13 05:58:57
【问题描述】:

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

【问题讨论】:

    标签: python google-cloud-bigtable happybase


    【解决方案1】:

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

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

    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)。

    【讨论】:

    • 是的,这行得通,但它并不完全相同,因为我可能不知道开始键和结束键。无论如何,这是我现在最好的选择,谢谢!
    • 任何前缀都可以转换为开始键和结束键。如果您的前缀是"abcd",那么start_key 应该是"abcd"(很明显!),而end_key 应该是"abce",因为"e" 是紧跟在"d" 之后的字符,而end_key 是不包括在扫描中。所有带有前缀"abcd" 的行都在"abcd" 和"abce" 之间(想想一个简单的字典)。此规则适用于字母数字行键,但请记住,在 BigTable/HBase 中,行键是字节数组,因此更通用的规则是 end_key 的最后一个字节应该等于前缀的最后一个字节 + 1。跨度>
    猜你喜欢
    • 2020-04-14
    • 2019-01-26
    • 2018-04-05
    • 2018-11-03
    • 2017-08-23
    • 1970-01-01
    • 2018-12-11
    • 2014-09-07
    • 2020-05-26
    相关资源
    最近更新 更多