#cassandra #cqlsh
#кассандра #cqlsh
Вопрос:
создать таблицу :
CREATE TABLE notifications (
id uuid PRIMARY KEY,
user_id bigint,
received_datetime timestamp,
);
cqlsh :
select count(*)
from notifications
where received_datetime >='2016-10-11 00:00:00'
and received_datetime >='2016-10-18 00:00:00'
ALLOW FILTERING;
получена ошибка :-
InvalidRequest: Error from server: code=2200 [Invalid query] message="More than one restriction was found for the start bound on received_datetime"
Ответ №1:
Я думаю, что вы на самом деле хотите следующий запрос:
select count(*) from notifications
where received_datetime >='2016-10-11 00:00:00'
and received_datetime <='2016-10-18 00:00:00'
ALLOW FILTERING;
В противном случае вы можете объединить два нижних граничных условия в одно, выбрав более строгое из них:
select count(*) from notifications
where received_datetime >= '2016-10-18 00:00:00'
ALLOW FILTERING;
Комментарии:
1. Запрос, который вы выполняете выше с РАЗРЕШЕННОЙ ФИЛЬТРАЦИЕЙ, является антишаблоном в Cassandra. Это вызовет операцию сбора разброса по всему кластеру, которая будет ужасно медленной и, скорее всего, истечет время ожидания при любом достаточно большом объеме данных. Вам следует изменить структуру таблицы, чтобы удовлетворить запрос, который вы задаете. Это означает настройку другого раздела и первичного ключа для ответа на этот запрос, если вы не знаете идентификатор, в этом случае вы можете просто добавить received_datetime в качестве столбца кластеризации и выполнить запрос диапазона для него.