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 ответов
чтобы ответить на ваши вопросы, я немного покопался в этом.
- захватывает ли Кассандра микросекунды с типом данных 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), но он был разрешен как " не исправит."
- как я могу это увидеть с помощью 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