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 中?

Google BigTable 是不是支持范围扫描?

BigTable:来自不同列族的两个列限定符可以具有相同的名称吗?

Bigtable / HBase:丰富的列族与单个 JSON 对象

尝试在 bigtable 中模拟单元级 TTL,但整个列族数据被垃圾收集删除