Bigtable 列族时间范围扫描返回所有行而不考虑时间戳
Posted
技术标签:
【中文标题】Bigtable 列族时间范围扫描返回所有行而不考虑时间戳【英文标题】:Bigtable column family time range scan returning all rows regardless of timestamp 【发布时间】:2019-07-10 23:48:55 【问题描述】:我正在尝试在我的 Scan
上使用 ColumnFamilyTimeRange
来仅读取 Bigtable 中的最近行。但是,无论我将时间范围设置为什么,扫描都会返回所有行。
我有一个列族。这是我所看到的:我为该列族添加了一个具有值的新行,然后等待,然后添加另一个新行。然后,我使用Scan
和普通的(即不是特定于列族的)TimeRange
集从 Bigtable 读取。它仅正确返回最近添加的行。
但是,当我将 TimeRange
更改为具有相同时间戳边界和唯一列族的 ColumnFamilyTimeRange
时,我会返回每一行。即使我将时间戳范围设置为一些无意义的东西(例如在我创建表之前),我仍然会返回每一行。
这是一个错误还是我完全错过了 ColumnFamilyTimeRange
的工作原理?
【问题讨论】:
【参考方案1】:目前不支持对列族进行时间戳范围扫描。不幸的是,与 HBase API 存在差异。你可以检查他们here。
【讨论】:
【参考方案2】:这种行为并不理想。我们不应该默默地删除 ColumnFamilyTimeRange。
我添加了https://github.com/googleapis/cloud-bigtable-client/issues/2184 来跟踪问题。同时,我建议使用 FilterList(MUST_PASS_ALL)、TimestampRangeFilter 和 FamilyFilter 过滤器的组合来获得所需的结果。
【讨论】:
嘿,谢谢伊戈尔!是否可以使用这样的过滤器,但如果任何单元格匹配则返回整行,如果没有单元格匹配则返回任何内容?因此,例如,如果我有如下一行:row_key_123 | col_1_value | col_2_value
,并且我只想在最近更新了 col_1
时才获得该行,这可能吗?
Bigtable 支持,但在 hbase api 中没有公开。如果您需要此功能,我建议您查看原生 Bigtable 客户端:github.com/googleapis/google-cloud-java/tree/master/…。 Query 对象允许您设置原生 Bigtable 过滤器,它是一个条件:googleapis.dev/java/google-cloud-clients/latest/com/google/…。
非常感谢伊戈尔!这正是我想要的。仅供参考,我认为时间戳过滤器存在错误。如果您使用带有.startOpen
的时间戳范围,它会将时间值加1(大概是为了使其“打开”)。但是,它会抛出一个错误说Timestamp granularity mismatch. Expected a multiple of 1000 (millisecond granularity), but got <timestamp ending in 001>
以上是关于Bigtable 列族时间范围扫描返回所有行而不考虑时间戳的主要内容,如果未能解决你的问题,请参考以下文章
使 SQL 查询返回重复行而不使用 UNION ALL 关闭
gcp bigtable 中的列族是啥,数据如何存储在 bigtable 中?
BigTable:来自不同列族的两个列限定符可以具有相同的名称吗?