【问题标题】:Cassandra timeuuid column to nanoseconds precisionCassandra timeuuid 列到纳秒精度
【发布时间】:2019-07-13 04:27:00
【问题描述】:
Cassandra 表有 timeuuid 数据类型列,那么我如何以纳秒为单位查看 timeuuid 类型的值?
timeuuid:
49cbda60-961b-11e8-9854-134d5b3f9cf8
49cbda60-961b-11e8-9854-134d5b3f9cf9
如何将此 timeuuid 转换为纳秒
需要一个 select 语句,如:
select Dateof(timeuuid) from the table a;
【问题讨论】:
标签:
cassandra
nanotime
timeuuid
【解决方案1】:
驱动程序UUIDs.unixTimestamp(UUID id) 中有一个实用方法,它返回一个可以转换为Date 对象的普通纪元时间戳。
值得注意的是,从 UUID 开始的 ns 精度不一定有意义。类型 1 uuid 包括一个时间戳,它是自 UTC 1582 年 10 月 15 日午夜首次采用公历以来的 100 纳秒间隔数。但是驱动程序需要一个 1 毫秒的时间戳(精度实际上取决于操作系统,甚至可以是 10 或 40 毫秒的精度)并保持一个单调计数器来填充剩余的 10000 个未使用的精度,但如果在 1 毫秒内有超过 10k 的值(注意:性能限制最终会阻止这种情况)。这样的性能要高得多,并且保证没有重复,尤其是在计算机中的亚毫秒时间精度在分布式系统中毫无意义。
因此,如果您从纯粹的 CQL 角度来看,没有 UDF 就无法做到这一点,并不是说无论如何超出 ms 值有很多价值,所以 dateOf 应该就足够了。如果你真的想要它
CREATE OR REPLACE FUNCTION uuidToNS (id timeuuid)
CALLED ON NULL INPUT RETURNS bigint
LANGUAGE java AS '
return id.timestamp();
';
将为您提供 1582 年 10 月 15 日起的 100ns。要将其转换为 epoc 的纳秒,请将其乘以 100 以转换为纳秒,并添加与纪元时间的差(-12219292800L * 1_000_000_000 纳秒)。这可能会溢出 long,因此可能需要使用不同的东西。