Google Bigtable python api rowkey正则表达式过滤器问题

时间:2018-01-22 23:05:09

标签: regex python-3.x gcp bigtable

最近,我一直在尝试使用python从Bigtable表中获取数据。我能够连接和验证api,我可以得到一些示例数据,但是当我去添加一个简单的rowkey正则表达式过滤器时,我得到一个空数据集,即使我知道那里应该有数据。

所有rowkeys都有这样的格式:

XY_1234567_Z

其中X和Y是大写字母A-Z,Z是数字0-9。 _1234567_是我提供的常量。 所以基本上我需要获取所有行,其中rowkey是包含_1234567_的所有内容。

这是我使用的正则表达式:

^.._1234567_.$

这是我当前代码的一个例子:

...
tbl            = instance.table(tableID)
regex          = ("^.._" + str(rowID) + "_.$").encode()
fltr           = RowKeyRegexFilter(regex)
row_data       = tbl.read_rows(filter_=fltr)
print(row_data.rows)

row_data.rows总是最终成为一个空字典。我尝试删除encode()并发送一个字符串,我也试过了一个不同的正则表达式来更具体,就像这个"([A-Z][A-Z])_" + str(rowID) + "_([0-9])"仍然没有用。如果我尝试执行row_data.consume_next(),它会挂起一段时间并最终给我一个StopIteration错误。我还用regex101测试了正则表达式,这看起来很好,所以我不确定问题出在哪里。

2 个答案:

答案 0 :(得分:2)

看起来您已经知道了,但是请参阅python Data API [1、2]的文档。调用row_data.consume_next()将获取流中的下一个ReadRowsResponse,并将其存储在row_data.rows中。当没有更多可消费的结果时,consumpt_next()将引发StopIteration异常。另外,您可以调用row_data.consume_all()以使用流中的所有结果(上限为可选)。

[1] https://googleapis.dev/python/bigtable/latest/data-api.html?highlight=consume_next#stream-many-rows-from-a-table

[2] https://gcloud-python-bigtable.readthedocs.io/en/data-api-complete/row-data.html#gcloud_bigtable.row_data.PartialRowsData

答案 1 :(得分:0)

我需要做的就是使用row_data.consume_next()来获取我请求的数据集。愚蠢的错误。 row_data对象最初是一个空的dict,但是一旦consume_next()读取流中的下一个项目就会填充。这引发了一个新问题,如果read_rows()没有找到任何匹配,consume_next()会挂起,但这是另一个问题。