Упорядоченные данные с Cassandra RandomPartitioner - PullRequest
2 голосов
/ 25 июля 2011

У меня есть около миллиарда данных, которые я хотел бы хранить на Кассандре. Элементы данных упорядочены по времени, и один из основных запросов, которые я буду выполнять, - найти элементы между двумя временными диапазонами по порядку. Я действительно предпочел бы использовать RandomParititioner, если это вообще возможно. Есть ли способ сделать это в Кассандре?

Сначала, так как я пришел из SQL, я предполагал, что я должен создать каждое событие как строку, но потом мне пришло в голову, что я думаю об этом неправильно, и я действительно должен использовать столбцы. Столбцы в Кассандре, кажется, упорядочены, но я не совсем понимаю, насколько они упорядочены. Если я использую время в качестве имени столбца, есть ли способ перевести все столбцы из одного времени в другое по порядку?

Еще одна вещь, на которую я обратил внимание, - это функция 0.7 вторичных индексов, но у меня возникли проблемы с поиском документации о том, могу ли я использовать их для просмотра ряда вещей по порядку.

Все, что я хочу, - это эквивалент Cassandra этого SQL: «Выберите * из Stuff, где date> X и date

1 Ответ

5 голосов
/ 25 июля 2011

Разделитель влияет только на распределение ключей по кольцу, а не на порядок столбцов в ключе. Столбцы всегда упорядочены в соответствии с Компаратором столбцов, определенным для семейства столбцов.

Вы можете вызвать get_slice с SlicePredicate, который задает SliceRange, чтобы получить все столбцы ключа в пределах диапазона.

Чтобы смоделировать ваши данные, вы можете создать 1 строку для каждого дня (или подходящего временного сегмента) и иметь столбец для каждого фрагмента данных. Что-то вроде

"yyyy-mm-dd" : {  #key, one for each day
    timeStampMillis1:dataid1 : "value1" # one column for each piece of data
    timeStampMillis2:dataid2 : "value2" 
    timeStampMillis3:dataid3 : "value3" 
}

Имена столбцов должны быть двоичными, используя двоичный компаратор. Первые 8 байтов являются меткой времени, а остальные байты являются идентификатором данных.

Предполагая, что X и Y находятся в один и тот же день, чтобы найти все элементы между X и Y, выполните команду get_slice для клавиши дня с SlicePredicate со SliceRange, указывающим начало X и конец Y + 1 , И начало, и конец - это байтовые массивы по 8 байтов.

Чтобы найти данные за несколько дней, прочитайте несколько ключей.

...