2

我想扫描一个大表以获取 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
4

1 回答 1

2

与其在 Table.scan() 中使用row_startandrow_stop参数,这可能更适合filter带有正则表达式的参数。

有关filter 参数的详细信息,请参阅API 参考:

还支持关键字参数filter(此处支持的列和行范围过滤器除外)。HappyBase / HBase 用户将使用它作为 HBase 过滤器字符串。(有关这些过滤器的更多详细信息,请参阅Thrift 文档。)但是,Google Cloud Bigtable 不支持这些过滤器字符串,因此RowFilter应该使用 a。

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)
于 2020-05-02T19:57:35.757 回答