Столбцы запросов на основе даты и времени в Кассандре - PullRequest
4 голосов
/ 21 марта 2012

Мы пытаемся создать / запросить информацию из CF на основе следующей структуры (например, datetime, datetime, integer)

e.g.
03-22-2012 10.00, 03-22-2012 10.30 100
03-22-2012 10.30, 03-22-2012 11.00 50
03-22-2012 11.00, 03-22-2012 11.30 200

Как мне смоделировать вышеуказанную структуру в Cassandra и выполнить следующеезапросы через Гектора.

select * from <CF> where datetime1 > 03-22-2012 10.00 and datetime2 < 03-22-2012 10.30
select * from <CF> where datetime1 > 03-22-2012 10.00 and datetime2 < 03-22-2012 11.00
select * from <CF> where datetime = 03-22-2012 (i.e. for the entire day)

Ответы [ 2 ]

2 голосов
/ 22 марта 2012

Это отличное введение в работу с датами и временем в Cassandra: Базовый временной ряд с Cassandra .

Короче говоря, используйте метки времени (или v1 UUID) в качестве имен столбцов иустановите компаратор в LongType (или TimeUUIDType), чтобы получить хронологическую сортировку столбцов.Тогда легко получить кусочек данных между двумя точками во времени.

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

0 голосов
/ 22 марта 2012

К сожалению, в Кассандре просто невозможно сделать это с одним семейством столбцов.Проблема в том, что вы хотите, чтобы cassandra сортировал по двум различным причинам: datetime1 и datetime2.

Очевидная структура для этого состоит в том, чтобы ваши столбцы были составными типами составных (TimeUUID, TimeUUID, Integer).В этом случае они будут отсортированы по datetime1, затем datetime2, а затем целому числу.

Но вы всегда получите порядок, основанный на datetime1, а не на datetime2 (хотя, если две записи имеют одинаковый datetime1, тогда это будетупорядочить только эти записи на основе datetime2).

Возможный обходной путь - иметь два семейства столбцов с дублирующимися данными (или, по сути, две строки для каждой логической строки).Одна строка, в которую вставляются данные (datetime1: datetime2: integer), а другая - куда они вставляются (datetime2: datetime1: integer).Затем вы можете выполнить операцию над несколькими строками и объединить данные, прежде чем передать их вызывающей стороне:

final MultigetSliceQuery<String, Composite, String> query = HFactory.createMultigetSliceQuery(keyspace,
    StringSerializer.get(),
    CompositeSerializer.get(),
    StringSerializer.get());

query.setColumnFamily("myColumnFamily");
startQuery.setKeys("myRow.arrangedByDateTime1", "myRow.arrangedByDateTime2");
startQuery.setRange(new Composite(startTime), new Composite(endTime), false, Integer.MAX_VALUE);

final QueryResult<Rows<String,Composite,String>> queryResult = query.execute();
final Rows<String,Composite,String> rows = queryResult.get();
...