Столбец Cassandra timeuuid с точностью до наносекунд

В таблице Cassandra есть столбец типа данных timeuuid, так как мне увидеть значение типа timeuuid в наносекундах?

timeuuid:

49cbda60-961b-11e8-9854-134d5b3f9cf8
49cbda60-961b-11e8-9854-134d5b3f9cf9

Как преобразовать этот timeuuid в наносекунды, нужен оператор выбора, например:

select Dateof(timeuuid) from the table a;

person Shailaja Koppishetty    schedule 19.02.2019    source источник
comment
см. stackoverflow.com /вопросы/13070674/   -  person Chris Lohfink    schedule 19.02.2019


Ответы (1)


В драйвере UUIDs.unixTimestamp(UUID id) есть служебный метод, который возвращает обычную метку времени эпохи, которую можно преобразовать в объект Date.

Стоит отметить, что точность ns от времени UUID не обязательно будет иметь смысл. uuid типа 1 включает отметку времени, которая представляет собой количество 100-наносекундных интервалов с момента первого принятия григорианского календаря в полночь 15 октября 1582 года по всемирному координированному времени. Но драйвер берет отметку времени в 1 мс (точность зависит от ОС на самом деле, может быть даже с точностью 10 или 40 мс) и поддерживает монотонный счетчик для заполнения оставшейся части 10000 неиспользованной точности, но может в конечном итоге считать в будущем, если в 1 мс есть более 10 тыс. значений (примечание: ограничения производительности в конечном итоге предотвратят это). Это гораздо более производительно и гарантирует отсутствие дубликатов, тем более что точность времени в компьютерах менее мс в распределенной системе довольно бессмысленна.

Так что, если вы смотрите исключительно с точки зрения CQL, нет способа сделать это без UDF, не то, чтобы в любом случае было много смысла выходить за пределы значения ms, поэтому dateOf должно быть достаточно. Хотя, если ты ДЕЙСТВИТЕЛЬНО этого хочешь

CREATE OR REPLACE FUNCTION uuidToNS (id timeuuid)
  CALLED ON NULL INPUT RETURNS bigint
  LANGUAGE java AS '
    return id.timestamp();
  ';

Даст вам 100 нс от 15 октября 1582 года. Чтобы перевести это в наносекунды из epoc, умножьте его на 100, чтобы преобразовать в нано, и добавьте разницу со временем эпохи (-12219292800L * 1_000_000_000 в нано). Это может привести к переполнению длин, поэтому может потребоваться использовать что-то другое.

person Chris Lohfink    schedule 19.02.2019