Это странно сложно моделировать.
Я думаю, что использование вторичных индексов 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. Это будет проверять каждую строку после начала и только возвращать те, у которых есть столбцы до окончания. Не очень эффективен, и вам нужно сделать большой мультигейт и т. Д. Встроенный вторичный индексный подход лучше, потому что узлы будут индексировать только локальные данные, и большая часть кода индексации шаблонов обрабатывается для вас.