最近,我一直在尝试使用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测试了正则表达式,这看起来很好,所以我不确定问题出在哪里。
答案 0 :(得分:2)
看起来您已经知道了,但是请参阅python Data API [1、2]的文档。调用row_data.consume_next()将获取流中的下一个ReadRowsResponse,并将其存储在row_data.rows中。当没有更多可消费的结果时,consumpt_next()将引发StopIteration异常。另外,您可以调用row_data.consume_all()以使用流中的所有结果(上限为可选)。
答案 1 :(得分:0)
我需要做的就是使用row_data.consume_next()来获取我请求的数据集。愚蠢的错误。 row_data对象最初是一个空的dict,但是一旦consume_next()读取流中的下一个项目就会填充。这引发了一个新问题,如果read_rows()没有找到任何匹配,consume_next()会挂起,但这是另一个问题。