Хранение диапазонов времени в Кассандре - PullRequest
6 голосов
/ 12 января 2011

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

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

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

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

1 Ответ

6 голосов
/ 13 января 2011

Это странно сложная модель для эффективного моделирования.

Я думаю, что использование вторичных индексов Кассандры (наряду с фиктивным индексированным значением, которое, к сожалению, все еще необходимо в данный момент), является вашим лучшим вариантом. Вам нужно будет использовать одну строку для каждого события, по крайней мере, с тремя столбцами: «начало», «конец» и «пустышка». Создайте вторичный индекс для каждого из них. Первые два могут быть LongType и последним может быть BytesType. См. этот пост об использовании вторичных индексов для более подробной информации. Поскольку для запроса вторичного индекса необходимо использовать выражение 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, что почти всегда является плохой вещью. Для индекса вы должны использовать время начала в качестве ключа строки и время окончания в качестве имени столбца. Затем вы можете выполнить срез диапазона с помощью start_key = start_time и column_finish = finish_time. Это будет сканировать каждую строку после времени начала и будет возвращать только те, у которых есть столбцы, до времени окончания. Не очень эффективный, и вы должны сделать большой мульти-гаджет и т. Д. Подход со встроенным вторичным индексом лучше, потому что узлы будут индексировать только локальные данные, и большая часть стандартного кода индексации обрабатывается для вас.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...