如何在HappyBase中用一个API调用来扫描行的集合?

问题描述 投票:0回答:1

我想扫描一个大表中的ID(或ID的前缀)列表(使用Python HappyBase)。

有什么方法可以在服务器端实现吗?也就是说,我想在一次API调用中发送一个要扫描的起止行列表,而不是执行一长串API调用。

下面是一个例子。对于my_big_tables键。

2019/1
2019/2
2019/3
...
2020/1
2020/2
2020/3
2020/4
..

在一个查询中,我想得到所有年份的1号和2号月的记录 结果应该是。

2019/1
2019/2
2020/1
2020/2
python google-cloud-platform bigtable happybase
1个回答
2
投票

而不是使用 row_startrow_stop 参数,这可能更适合于Table.scan()中的 filter 参数的正则表达式。

参见 API参考 以了解过滤器参数的详细信息。

关键字参数 filter 也是支持的(除了这里支持的列和行范围过滤器外)。HappyBase HBase的用户会将此作为HBase的过滤器字符串。(参见 旧文件 以了解更多关于这些过滤器的细节。) 然而,Google Cloud Bigtable 不支持这些过滤器字符串,因此,一个 RowFilter 应该使用。

RowFilter是Google的Bigtable库提供的一个类型。这里是文档. 假设你所指的ID字段是你的行键,我们可以使用 RowKeyRegexFilter 来按照你描述的模式过滤ID。

我们先用一个正则表达式来匹配所需月份的 ID 列表。例如,如果你想过滤 12 月和 1 月的基于年份的 ID,你可以使用这个方法(注意,你必须从最大的数字到最短的数字)--见 这个环节 来测试正则表达式。

\d\d\d\d\/(12|1)

这里是一个尝试写一个函数来创建一个Google Bigtable HappyBase扫描调用,并使用适当的过滤器,其中: table 是一个HappyBase表和 months 是一个整数列表。请注意,我有 测试了这段代码,但希望它至少给你一个起点。

from google.cloud.bigtable.row_filters import RowKeyRegexFilter

def filter_by_months(table, months):
    months_reversed = sorted(months, reverse=True)
    months_strings = [str(month) for month in months_reversed]
    months_joined = "|".join(months_strings)

    key_filter = RowKeyRegexFilter('\d\d\d\d\/({})'.format(months_joined))
    return table.scan(filter=key_filter)
© www.soinside.com 2019 - 2024. All rights reserved.