2012-03-21 2 views
4

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

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) 
+0

Я не уверен, но возможно иметь имя столбца в качестве метки времени? – Nishant

ответ

2

Это большое введение к работе с датами и временем в Кассандре: Basic Time Series with Cassandra.

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

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

+0

Прошел эту статью раньше, но я не хочу делать TimeUUID (сейчас), я бы хотел указать время, как я уже упоминал ранее, через ввод. Наш план состоял в том, чтобы захватывать/хранить данные каждые 5 минут, и мы будем хранить каждую строку в течение 5-минутного интервала в пределах одного CF –

+1

. Вы полностью изменили свой вопрос после того, как я начал писать свой ответ, поэтому мой ответ немного не по теме , Тем не менее, вы можете создавать UUID времени с заданной меткой времени; там должны быть java-библиотеки, способные это сделать. –

0

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

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

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

Возможным обходным решением было бы иметь два семейства столбцов с дублирующимися данными (или даже две строки для каждой логической строки). Одна строка, в которую вставлены данные (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(); 
Смежные вопросы