У меня есть значения, хранящиеся для столбца тип отметки времени в таблице 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.
В первом случае проблема заключается в том, что вы указываете метку времени в микросекундах, в то время как Cassandra работает с миллисекундами - попробуйте удалить три последние цифры - .950
вместо .950000
(подробности см. В этом документ). Метки времени хранятся внутри Cassandra как 64-битные числа, а затем форматируются при печати результатов с использованием формата, указанного параметрами datetimeformat
в cqlshrc
(см. док). Для дат без явного часового пояса потребуется, чтобы часовой пояс по умолчанию был указан в cqlshrc
.
Что касается вашего вопроса о фильтрации данных - этот запрос будет работать только для небольших объемов данных, а для больших объемов данных, скорее всего, произойдет тайм-аут, так как ему потребуется сканировать все данные в кластере. Кроме того, данные не будут правильно отсортированы, потому что сортировка происходит только внутри одного раздела.
Если вы хотите выполнять такие запросы, то, возможно, лучшим выбором будет Spark Cassandra Connector, поскольку он может эффективно выбирать необходимые данные, а затем вы можете выполнять сортировку и т. д. Хотя для этого потребуется гораздо больше ресурсов.
Я рекомендую пройти курс DS220 от DataStax Academy, чтобы понять, как моделировать данные для Cassandra.
Как я уже сказал, данные хранятся так долго, а не как конкретный формат даты - когда данные отправляются, они анализируются из строки в long, а при извлечении - конвертируются из long в строку
только что проверил, для моего теста он работал нормально: 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';
выбрал данные (ваше время будет другим)
Да, я попробовал еще раз. Это сработало после удаления трех последних цифр - 0,950 вместо 0,950000. Думаю, я упустил это из виду, запросив ранее неправильную дату или формат. Спасибо!
Это работает для меня
var datetime = DateTime.UtcNow.ToString("yyyy-MM-dd HH:MM:ss");
var query = $"SET updatedat = '{datetime}' WHERE ...
Извините, но это не отвечает на точный вопрос ... плюс это не лучшая практика использовать подстановку строк - по соображениям производительности лучше использовать подготовленные операторы и вместо этого связывать правильный тип данных, и драйвер будет делать правильно принуждение
Спасибо! Алекс. Я уже пытался удалить три последние цифры - .950 вместо .950000, но безуспешно. Я также проверял ссылку на datastax, чтобы проверить, как cassandra хранит и форматирует временные метки. Похоже, мне также нужно проверить изменение HH: MM: SS.sss на временные метки других часовых поясов (возможно, как фактический формат до того, как он был сохранен в кассандре).