2011-01-12 2 views
6

Я ищу хороший способ хранения данных, связанных с диапазоном времени, чтобы иметь возможность эффективно извлекать его позже.Сохранение временных диапазонов в cassandra

Каждый элемент данных может быть упрощен как (start time, end time, value). Мне нужно будет потом получить все записи, которые попадают в диапазон (x, y). В SQL, запрос будет что-то вроде

SELECT value FROM data WHERE starttime <= x AND endtime >= y

Можете ли вы предложить структуру данных в Кассандре, которые позволили бы мне эффективно выполнять такие запросы?

ответ

6

Это странно сложно моделировать.

Я думаю, что использование вторичных индексов Cassandra (наряду с фиктивным индексированным значением, которое, к сожалению, все еще необходимо на данный момент), является вашим лучшим вариантом. Вам нужно будет использовать одну строку для каждого события с по меньшей мере тремя столбцами: «start», «end» и «dummy». Создайте вторичный индекс для каждого из них. Первые два могут быть LongType, а последним может быть BytesType. См. this post on using secondary indexes для более подробной информации. Поскольку вы должны использовать выражение EQ по крайней мере для одного столбца для вторичного запроса индекса (к неудачному требованию, о котором я упоминал), EQ будет на «фиктивном», который всегда может установить значение 0. (Это означает, что выражение индекса EQ будет соответствовать каждой строке и по существу быть не-оператором.) Вы можете сохранить остальные данные события в строке рядом с началом, концом и манекеном.

В pycassa, клиент Python Cassandra, ваш запрос будет выглядеть следующим образом:

from pycassa.index import * 
start_time = 12312312000 
end_time = 12312312300 
start_exp = create_index_expression('start', start_time, GT) 
end_exp = create_index_expression('end', end_time, LT) 
dummy_exp = create_index_expression('dummy', 0, EQ) 
clause = create_index_clause([start_exp, end_exp, dummy_exp], count=1000) 
for result in entries.get_indexed_slices(clause): 
    # do stuff with result 

Там должно быть что-то подобное в других клиентах.

Альтернатива, которую я рассматривал в первую очередь, касалась OrderPreservingPartitioner, который почти всегда является Bad Thing. Для индекса вы должны использовать время запуска в качестве ключа строки и время окончания в качестве имени столбца. Затем вы можете выполнить срез диапазона с start_key = start_time и column_finish = finish_time. Это будет проверять каждую строку после начала и только возвращать те, у которых есть столбцы до окончания. Не очень эффективен, и вам нужно сделать большой мультигейт и т. Д. Встроенный вторичный индексный подход лучше, потому что узлы будут индексировать только локальные данные, и большая часть кода индексации шаблонов обрабатывается для вас.

Смежные вопросы