cassandra получает все записи во временном диапазоне

Мне нужно работать с семейством столбцов, которое имеет (user_id, timestamp) в качестве ключа. В моем запросе я хотел бы получить все записи за определенный временной интервал, не зависящий от user_id. Это точная схема таблицы:

CREATE TABLE userlog ( user_id text, ts timestamp, action text, app_type text, channel_name text, channel_session_id text, pid text, region_id text, PRIMARY KEY (user_id, ts) ) 

Я попытался запустить

 SELECT * FROM userlog WHERE ts >= '2013-01-01 00:00:00+0200' AND ts <= '2013-08-13 23:59:00+0200' ALLOW FILTERING; 

который отлично работает на моей локальной установке cassandra, содержащей небольшой dataset, но с

 Request did not complete within rpc_timeout. 

на продуктивной системе, содержащей все данные.

Есть ли запрос, предпочтительно cql, который работает плавно с данным семейством столбцов или мы должны изменить дизайн?

    Тайм-аут состоит в том, что Cassandra занимает больше времени ожидания (по умолчанию 10 секунд), чтобы вернуть данные. По вашему запросу Cassandra попытается извлечь весь dataset перед возвратом. Для более чем нескольких записей это может занять больше времени, чем таймаут.

    Для запросов, которые производят множество данных, вам нужно указать страницу

     SELECT * FROM userlog WHERE ts >= '2013-01-01 00:00:00+0200' AND ts <= '2013-08-13 23:59:00+0200' AND token(user_id) > previous_token LIMIT 100 ALLOW FILTERING; 

    где user_id – предыдущий user_id. Вам также понадобится страница на ts, чтобы гарантировать, что вы получите все записи для последнего user_id.

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

    ALLOW FILTERING означает, что Cassandra считывает все ваши данные, но только возвращает данные в указанном диапазоне. Это эффективно только в том случае, если диапазон – это большая часть данных. Если вы хотите найти записи, например, через 5-минутное окно, это будет очень неэффективно.

    Кажется, что горячая точка для возможности запроса по времени (или любому диапазону) заключается в том, чтобы указать какой-то «другой столбец» в качестве ключа раздела, а затем указать метку времени как «столбец кластеризации»,

     CREATE TABLE postsbyuser ( userid bigint, posttime timestamp, postid uuid, postcontent text, PRIMARY KEY ((userid), posttime) ) WITH CLUSTERING ORDER BY (posttime DESC); 

    вставлять поддельные данные

      insert into postsbyuser (userid, posttime) values (77, '2013-04-03 07:04:00'); 

    и запрос (важная часть заключается в том, что это «быстрый» запрос и ALLOW FILTERING не требуется, как это должно быть):

      SELECT * FROM postsbyuser where userid=77 and posttime > '2013-04-03 07:03:00' and posttime < '2013-04-03 08:04:00'; 

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

    Если вы используете трюк стиля «group by day», тогда вторичный индекс также будет вариантом (хотя вторичные индексы, похоже, работают только с «EQ» = operator?).

    Interesting Posts

    Лучший srvany.exe для Windows XP и Windows 7?

    Вычислить разницу даты и времени в Excel

    Включить экранную клавиатуру Windows 8 на настольном ПК

    Как вы обрабатываете ресурсы в MATLAB безопасным образом? (например, «попробуй … наконец»)

    Как я могу получить список каталогов ресурсов из моего приложения для Android?

    iPhone SDK – Как воспроизвести видео с прозрачностью?

    Неуправляемые DLL не загружаются на сервере ASP.NET

    Как преобразовать строку в список в Python?

    Разделить временные ряды данных на временные интервалы (скажем, час), а затем построить график

    масштаб HTML5 Видео и разбить соотношение сторон для заполнения всего сайта

    Можно ли использовать ShowDialog без блокировки всех форм?

    Каков правильный способ инициализации массива с фиксированной длиной?

    Лучший дизайн для таблицы базы данных изменений / аудита?

    Почему мой светодиодный индикатор жесткого диска мигает каждую секунду?

    Всплывающее окно Android не заполняет размер экрана?

    Давайте будем гением компьютера.