如何使用单个 API 调用扫描 HappyBase 中的行集?
Posted
技术标签:
【中文标题】如何使用单个 API 调用扫描 HappyBase 中的行集?【英文标题】:How can I scan over sets of rows in HappyBase with a single API call? 【发布时间】:2020-04-27 14:56:42 【问题描述】:我想扫描一个大表以查找 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
【问题讨论】:
感谢您授予赏金!如果对您有用,您能否将答案标记为已解决? 【参考方案1】:与其在 Table.scan() 中使用 row_start
和 row_stop
参数,这可能更适合带有正则表达式的 filter
参数。
有关过滤器参数的详细信息,请参阅API reference:
还支持关键字参数
filter
(除了列和行 此处支持范围过滤器)。 HappyBase / HBase 用户将使用过 这是一个 HBase 过滤器字符串。 (有关详细信息,请参阅Thrift docs 在这些过滤器上。)但是,Google Cloud Bigtable 不支持 那些过滤器字符串,所以应该使用RowFilter
。
RowFilter 是 Google 的 Bigtable 库提供的一种类型。 Here are the docs。假设您引用的 ID 字段是您的行键,我们可以使用 RowKeyRegexFilter 按您描述的模式过滤 ID。
我们将首先提出一个正则表达式来匹配所需月份的 ID 列表。例如,如果您想过滤 12 月和 1 月的基于年份的 ID,您可以使用它(请注意,您必须从最大的数字到最短的数字)——请参阅 this link 来测试正则表达式:
\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)
【讨论】:
以上是关于如何使用单个 API 调用扫描 HappyBase 中的行集?的主要内容,如果未能解决你的问题,请参考以下文章
使用 ruby、Sinatra 和 Mandrill 如何从 api 调用访问单个元素并打印为 HTML?
如何获取我们无法通过 Zoho Creator 中的单个 API 调用获取的剩余记录?
如何在 Camera2 API Android 5.0 中获取单个预览帧?
如何在单个 API 调用中获取单个 VM 的多个 VM 指标(百分比 CPU、磁盘读取操作/秒、内存等 .. 平台指标)详细信息