我想扫描一个大表中的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
而不是使用 row_start
和 row_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)