Запрос столбцов на основе даты и времени в Cassandra

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

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 и выполнить следующие запросы через Hector.

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)

person Karthik S    schedule 21.03.2012    source источник
comment
Я не уверен, но возможно ли использовать имя столбца в качестве метки времени?   -  person Nishant    schedule 21.03.2012


Ответы (2)


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

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

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

person Tyler Hobbs    schedule 22.03.2012
comment
Проходил эту статью раньше, но я не хочу делать TimeUUID (сейчас), я бы предпочел указать время, как я упоминал ранее, через ввод. Наш план состоял в том, чтобы собирать/сохранять данные каждые 5 минут, и мы будем хранить каждую строку в течение 5-минутного интервала в пределах одного CF. - person Karthik S; 22.03.2012
comment
Вы полностью изменили свой вопрос после того, как я начал писать свой ответ, поэтому мой ответ теперь немного не по теме. Однако вы можете создавать UUID времени с заданной отметкой времени; должны быть java-библиотеки, способные это сделать. - person Tyler Hobbs; 22.03.2012

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

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

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

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

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();
person agentgonzo    schedule 22.03.2012