如何解决Bigtable:获取整行的最佳方法,其中某个列 = 某个值?
抱歉,这可能是一个简单的问题,但我没有找到任何好的答案。
我想查询某一列等于某个值的整行数据。
chain1 = row_filters.RowFilterChain(
filters=[
row_filters.ColumnQualifierRegexFilter("VOLTAGE SCREW CONVEYOR DRIVE"),row_filters.ValueRangeFilter(b"0.693",b"1")
]
)
这是我的过滤器,但这只能获取 1 个单元格。我想得到整行。任何人都知道如何做到这一点的任何大师提示?
#Edit,我设法通过两次调用 Bigtable 来实现它。但我认为它根本没有效率。
chain1 = row_filters.RowFilterChain(
filters=[
row_filters.ColumnQualifierRegexFilter("VOLTAGE SCREW CONVEYOR DRIVE"),b"1"),row_filters.StripValueTransformerFilter(True)
]
)
rows = table.read_rows(row_set=row_set,filter_=chain1)
# Get the rowkeys
rowkeys = [row.row_key for row in rows]
# Get the rows for these rowkeys
row_set = RowSet()
for rk in rowkeys:
row_set.add_row_key(rk)
# Final soln
rows = table.read_rows(row_set=row_set)
解决方法
您无法使用列过滤器从 read_rows 中获取所有列。 请参阅 read_rows() 的文档:
filter (RowFilter) –(可选)应用于指定行内容的过滤器。如果未设置,则读取每行中的每一列。
https://googleapis.dev/python/bigtable/latest/table.html
,您可以使用 conditional row filter 将基本过滤器与真过滤器和假过滤器结合起来。如果基本过滤器发出任何单元格,则使用真过滤器,否则使用假过滤器。按照你的例子,它会是这样的
condition = RowFilterChain(
filters=[
ColumnQualifierRegexFilter("VOLTAGE SCREW CONVEYOR DRIVE"),ValueRangeFilter(b"0.693",b"1"),CellsPerRow(1),// since we only need one cell to trigger the true filter
]
)
conditionalFilter = row_filters.ConditionalRowFilter(
base_filter = condition,true_filter = PassAllFilter(),// this way you get the whole row and not just the single cell value
false_filter = BlockAllFilter()
)
,
最有效的方法可能是围绕这个问题为您的表格建模。 BT 不是为数据模型灵活性而设计的——它不是 SQL。为了快速、高效地读取,不要依赖行内的条件。您应该考虑在行键中添加该值或生成一个专用表,其中所有数据都满足您的条件(从而消除条件)。使用过滤器会影响性能)。
引用谷歌: 条件过滤器尤其会增加延迟,因为条件比其他过滤器慢得多。如果您的读取请求对性能极其敏感,请不要在请求中使用条件。 (见https://cloud.google.com/bigtable/docs/filters)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。