Невозможно привести к форматированной дате - тип отметки времени Cassandra

У меня есть значения, хранящиеся для столбца тип отметки времени в таблице cassandra в формате 2018-10-27 11: 36: 37.950000 + 0000 (дата по Гринвичу). Я получаю Невозможно привести '2018-10-27 11: 36: 37.950000 + 0000' к форматированной дате (длинная), когда запускаю запрос ниже для получения данных.

select create_date from test_table where create_date='2018-10-27 11:36:37.950000+0000' allow filtering;

Как заставить запрос работать, если данные уже хранятся в таблице (формата 2018-10-27 11:36: 37.950000 + 0000), а также выполнить операции диапазона (> = или <=) для столбца create_date?

Пробовал с create_date='2018-10-27 11:36:37.95Z',create_date='2018-10-27 11:36:37.95'create_date='2018-10-27 11:36:37.95'too.

Можно ли выполнить фильтрацию данных типа временной метки?

P.S. Использование cqlsh для выполнения запроса к таблице cassandra.

Установка Apache Cassandra на Mac OS
Установка Apache Cassandra на Mac OS
Это краткое руководство по установке Apache Cassandra.
3
0
2 523
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

В первом случае проблема заключается в том, что вы указываете метку времени в микросекундах, в то время как Cassandra работает с миллисекундами - попробуйте удалить три последние цифры - .950 вместо .950000 (подробности см. В этом документ). Метки времени хранятся внутри Cassandra как 64-битные числа, а затем форматируются при печати результатов с использованием формата, указанного параметрами datetimeformat в cqlshrc (см. док). Для дат без явного часового пояса потребуется, чтобы часовой пояс по умолчанию был указан в cqlshrc.

Что касается вашего вопроса о фильтрации данных - этот запрос будет работать только для небольших объемов данных, а для больших объемов данных, скорее всего, произойдет тайм-аут, так как ему потребуется сканировать все данные в кластере. Кроме того, данные не будут правильно отсортированы, потому что сортировка происходит только внутри одного раздела.

Если вы хотите выполнять такие запросы, то, возможно, лучшим выбором будет Spark Cassandra Connector, поскольку он может эффективно выбирать необходимые данные, а затем вы можете выполнять сортировку и т. д. Хотя для этого потребуется гораздо больше ресурсов.

Я рекомендую пройти курс DS220 от DataStax Academy, чтобы понять, как моделировать данные для Cassandra.

Спасибо! Алекс. Я уже пытался удалить три последние цифры - .950 вместо .950000, но безуспешно. Я также проверял ссылку на datastax, чтобы проверить, как cassandra хранит и форматирует временные метки. Похоже, мне также нужно проверить изменение HH: MM: SS.sss на временные метки других часовых поясов (возможно, как фактический формат до того, как он был сохранен в кассандре).

user923499 27.10.2018 19:37

Как я уже сказал, данные хранятся так долго, а не как конкретный формат даты - когда данные отправляются, они анализируются из строки в long, а при извлечении - конвертируются из long в строку

Alex Ott 27.10.2018 19:39

только что проверил, для моего теста он работал нормально: create table t1(tm timestamp primary key, t text);, затем insert into t1(tm, t) values(toTimestamp(now()), 't');, затем select * from t1 where tm = '2018-10-27 18:01:54.738+0000'; выбрал данные (ваше время будет другим)

Alex Ott 27.10.2018 20:05

Да, я попробовал еще раз. Это сработало после удаления трех последних цифр - 0,950 вместо 0,950000. Думаю, я упустил это из виду, запросив ранее неправильную дату или формат. Спасибо!

user923499 27.10.2018 20:57

Это работает для меня

var datetime = DateTime.UtcNow.ToString("yyyy-MM-dd HH:MM:ss");
                var query = $"SET  updatedat = '{datetime}' WHERE ...

Извините, но это не отвечает на точный вопрос ... плюс это не лучшая практика использовать подстановку строк - по соображениям производительности лучше использовать подготовленные операторы и вместо этого связывать правильный тип данных, и драйвер будет делать правильно принуждение

Alex Ott 03.12.2020 08:13

Другие вопросы по теме