在Bigtable中,自定义时间戳的最高有效值是什么



我使用的是HBase java驱动程序v1.16,在创建一个具有自定义时间戳的单元格作为值大于2^53的long时,我遇到了一种奇怪的行为?

自定义时间戳的值有限制吗?它取决于客户端驱动程序的语言和版本,还是Bigtable固有的?

编辑:我遇到了与cbt相同的限制。

据我所知,您使用的是HBase java驱动程序v1.16,在Bigtable中创建一个具有自定义时间戳的单元格作为值大于2^53的long时,您会遇到奇怪的行为。您还要求自定义时间戳的限制(最高值(和依赖性,这导致了这种差异。

Bigtable可以存储的最大HBase时间戳是Long。MAX_VALUE/1000,任何大于该值的值都将转换为Long。MAX_VALUE/1000。因此,大的反向时间戳值可能无法正确转换,这可能是值超过2^53时出现奇怪行为的原因。

Bigtable以微秒存储时间戳,而HBase以毫秒存储时间戳。当HBase客户端库用于Bigtable并且具有反向时间戳的数据时,这种区别就有了意义。这可能有助于解决两者之间的依赖关系。

由于您使用Java的Apache HBase客户端的自定义版本访问Cloud Bigtable,因此,当在HBase中以毫秒为单位输入时间戳值时,它会转换为微秒,因为它以微秒为单位存储时间戳。客户端库在微秒和毫秒之间转换,因为两者之间存在这种区别。

您可以参考此链接了解有关上述要点的更多信息。https://cloud.google.com/bigtable/docs/hbase-differences

有关HBase类TimeRange的更多信息,请参阅本文档。https://hbase.apache.org/1.1/apidocs/org/apache/hadoop/hbase/io/TimeRange.html

根据Go语言的API参考文档,它有一个Timestamp类型,它表示Timestamp是int64。自1970年1月1日起,时间戳以微秒为单位但是时间戳将被截断为毫秒粒度,因为这是Go客户端库当前支持的唯一粒度。因此,当在单元格中输入大于2*53的时间戳值时,cbt为什么会面临与HBasejava驱动程序相同的问题。

查看Java客户端的bigtable,粒度仅设置为毫秒,如文档链接中所示

Java的Hbase客户端、Bigtable的Java客户端和cbt都支持高达毫秒的时间戳粒度尽管Bigtable内部以微秒为单位存储时间戳,但它支持将单元时间戳设置为毫秒粒度。

TIMESTAMP_GRANULARITY_UNSPECIFIED和MILLS具有相同的效果。服务器拒绝创建粒度高于支持值的单元格。将时间戳值的精度保持在毫秒左右可以帮助解决bigtable单元格实例中的奇怪行为。

最新更新