【问题标题】:TimeUUID vs timestamp in Cassandra?Cassandra中的TimeUUID与时间戳?
【发布时间】:2016-09-26 16:33:24
【问题描述】:

如果我们可以从 TimeUUID 中提取时间,那么在 Cassandra 中使用时间戳作为另一列是否有意义?

另外,我们如何从 TimeUUID 中提取时间并对其进行范围查询(例如 2016 年 1 月到 2016 年 5 月)?

【问题讨论】:

    标签: cassandra timeuuid nosql


    【解决方案1】:

    Timeuuid 函数

    现在

    now 函数不接受任何参数,并在协调器节点上生成一个新的唯一 timeuuid(在执行使用它的语句时)。请注意,此方法对插入很有用,但在 WHERE 子句中很大程度上是无意义的。例如,表单的查询

    SELECT * FROM myTable WHERE t = now() 设计上永远不会返回任何结果,因为 now() 返回的值保证是唯一的。

    minTimeuuidmaxTimeuuid

    minTimeuuid (resp. maxTimeuuid) 函数采用时间戳值 t(可以是时间戳或日期字符串)并返回对应于时间戳 t 的最小(或最大)可能的 timeuuid 的假 timeuuid。比如:

    SELECT * FROM myTable WHERE t > maxTimeuuid('2013-01-01 00:05+0000') AND t < minTimeuuid('2013-02-02 10:00+0000') 将选择 timeuuid 列 t 严格早于 2013-01-01 00:05+0000 但严格小于 2013-02-02 10:00+0000 的所有行。请注意t >= maxTimeuuid('2013-01-01 00:05+0000') 仍然不会选择恰好在2013-01-01 00:05+0000 处生成的timeuuid,它基本上等同于t > maxTimeuuid('2013-01-01 00:05+0000')

    Functions table

    警告:我们将 minTimeuuid 和 maxTimeuuid 生成的值称为假 UUID,因为它们不遵守 RFC 4122 指定的基于时间的 UUID 生成过程。特别是,这两种方法返回的值不会是唯一的。这意味着您应该只使用这些方法进行查询(如上例所示)。插入这些方法的结果几乎肯定是个坏主意。

    时间转换函数

    提供了许多函数来将 timeuuid、时间戳或日期“转换”为另一种本机类型。

    【讨论】:

      【解决方案2】:

      我遇到了这个问题,并在查询期间进行了转换。

      SELECT toTimestamp(uuid_timestamp) FROM table
      

      这不是问题,因为我正在插入熊猫数据框进行分析。

      【讨论】:

        【解决方案3】:

        如果您选择使用 timeuuid,则无需将时间戳存储在不同的列中。

        您正在寻找this

        请注意minmax。 LSB 位确定唯一性。即最后 8 位的范围可以从 00000000ffffffff

        因此,请相应地准备您的范围查询。

        希望这会有所帮助!

        【讨论】:

          猜你喜欢
          • 2016-11-21
          • 2019-09-27
          • 1970-01-01
          • 2012-07-01
          • 2013-07-30
          • 1970-01-01
          • 1970-01-01
          • 2017-04-04
          • 2011-07-18
          相关资源
          最近更新 更多