Cassandra cqlsh-как показать микросекунды/миллисекунды для столбцов метки времени?

я вставляю в таблицу Кассандры со столбцами метки времени. Данные, которые у меня есть, поставляются с точностью до микросекунды, поэтому строка данных времени выглядит так:

2015-02-16T18:00:03.234+00:00

однако в cqlsh при запуске запроса select данные микросекунды не отображаются, я могу видеть только время до второй точности. The 234 данные микросекунд не отображаются.

Я думаю, у меня есть два вопроса:

1) не Кассандра захватывает микросекунды с типом данных метки времени? Полагаю, да?

2) Как я могу видеть, что с cqlsh для проверки?

таблицы определения:

create table data (
  datetime timestamp,
  id text,
  type text,
  data text,
  primary key (id, type, datetime)
) 
with compaction = {'class' : 'DateTieredCompactionStrategy'};

вставить запрос выполняется с Java PreparedStatment:

insert into data (datetime, id, type, data) values(?, ?, ?, ?);

выбрать запрос было просто:

select * from data;

5 ответов


чтобы ответить на ваши вопросы, я немного покопался в этом.

  1. захватывает ли Кассандра микросекунды с типом данных timestamp?

микросекунды нет, миллисекунды да. Если я создам вашу таблицу, вставлю строку и попытаюсь запросить ее к усеченному времени, это не сработает:

aploetz@cqlsh:stackoverflow> INSERT INTO data (datetime, id, type, data) 
VALUES ('2015-02-16T18:00:03.234+00:00','B26354','Blade Runner','Deckard- Filed and monitored.');
aploetz@cqlsh:stackoverflow> SELECT * FROM data 
WHERE id='B26354' AND type='Blade Runner' AND datetime='2015-02-16 12:00:03-0600';

 id | type | datetime | data
----+------+----------+------

(0 rows)

но когда я запрашиваю то же самое id и type значения при указании миллисекунд:

aploetz@cqlsh:stackoverflow> SELECT * FROM data 
WHERE id='B26354' AND type='Blade Runner' AND datetime='2015-02-16 12:00:03.234-0600';

 id     | type         | datetime                 | data
--------+--------------+--------------------------+-------------------------------
 B26354 | Blade Runner | 2015-02-16 12:00:03-0600 | Deckard- Filed and monitored.

(1 rows)

так миллисекунд, безусловно, есть. Для этого вопроса был создан билет JIRA (Кассандра-5870), но он был разрешен как " не исправит."

  1. как я могу это увидеть с помощью cqlsh для проверки?

один из возможных способов проверить, что миллисекунды действительно есть, - это вложить


вы можете настройки выходного формата объекта datetime в .cassandra/cqlshrc файл, используя синтаксис "strftime" python.

к сожалению,%f директива для микросекунд (кажется, что нет директивы для миллисекунд)не работает для более старых версий python, что означает, что вы должны вернуться к blobAsBigint(timestampAsBlob(date)) решение.


Я думаю, что " микросекунды "(e.g 03.234567) вы имеете в виду" миллисекунды " (например, (03.234).

проблема здесь была cqlsh ошибка, которая не поддерживает дробные секунды при работе с метками времени.

таким образом, в то время как ваше значение миллисекунды было сохранено в фактическом слое персистентности (cassandra), оболочка (cqlsh) не смогла отобразить их.

это верно, даже если вы должны были изменить time_format на .cqlshrc для отображения дробных секунд с помощью %f директива (например %Y-%m-%d %H:%M:%S.%f%z). В этой конфигурации cqlsh будет отображать 3.000000 для нашего значения 3.234, так как проблема заключалась в том, как cqlsh загрузил объекты datetime без загрузки частичных секунд.

что все сказанное, эта проблема была исправлена в Кассандра-10428 и освобожден в Кассандра 3.4.


невозможно показать микросекунды (1 миллионная секунды), используя тип данных Cassandra "отметка времени", потому что наибольшая точность, доступная для этого типа данных, составляет миллисекунды (1 тысячная секунды).

http://docs.datastax.com/en/cql/3.1/cql/cql_reference/timestamp_type_r.html

значения для типа timestamp кодируются как 64-разрядные целые числа со знаком представление числа миллисекунд с момента стандартного базового времени известная как эпоха


некоторый связанный код:

cqlsh> CREATE KEYSPACE udf
  WITH replication = {'class': 'SimpleStrategy', 'replication_factor' : 3};

cqlsh> USE udf;

cqlsh:udf> CREATE OR REPLACE FUNCTION udf.timeuuid_as_us ( t timeuuid ) 
RETURNS NULL ON NULL INPUT
RETURNS bigint LANGUAGE JAVA AS '
  long msb = t.getMostSignificantBits();
  return
    ( ((msb >> 32) & 0x00000000FFFFFFFFL)
    | ((msb & 0x00000000FFFF0000L) << 16)
    | ((msb & 0x0000000000000FFFL) << 48)
    ) / 10
    - 12219292800000000L;
';

cqlsh:udf> SELECT
  toUnixTimestamp(now())    AS now_ms
, udf.timeuuid_as_us(now()) AS now_us
FROM system.local;

 now_ms        | now_us
---------------+------------------
 1525995892841 | 1525995892841000