2012-01-05 5 views
1

Предположим, что устройство может давать n сигналов в случайное время. Мы собираем эти данные из m устройств за определенный промежуток времени. Таким образом, наша «мета-схема» являетсяCassandra: данные моделирования по времени

DeviceId : int 
SignalId : int 
SignalDateTime : DateTime (with mSec as YY-MM-DD HHMMSS.mm) 
ExtraData : String 

Я хочу, чтобы положить эти данные в Кассандре и Im пытаясь понять различные способы. Я хотел бы получить данные из любой комбинации из трех значений (DeviceId, SignalId, SignalDateTime).

Я могу представить, используя DeviceId в качестве строки, а затем сопряжение SignalDateTime: SignalId. Но что мне делать с ExtraData? Может быть, это суперколонна? Аналогично, я мог бы создавать уникальные клавиши строк с DeviceId и SignalDateTime, но разве это разумный способ использовать Cassandra?

+0

Когда вы говорите, что вам нужно получить данные из любой комбинации трех значений, что именно вы имеете в виду. У вас может быть дата, но нет идентификатора устройства/сигнала, и вам нужно получить все данные с указанной датой. Или у вас может быть только идентификатор сигнала и нужно получить все устройства, у которых есть этот идентификатор сигнала, а также все данные для этого идентификатора сигнала? – nickmbailey

+0

@nickmbailey -> точно. – ethrbunny

ответ

3

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

Вы могли бы начать с следующими семействами столбцов:

CF1 
RowKey: DeviceID 
ColumnNames: SignalDateTime 
Value: Serialized [SignalID + ExtraData] 

CF2 
RowKey: SignalID 
ColumnName: SignalDateTime 
Value: Serialized [DeviceID + ExtraData] 

значением будет какая-то последовательная формой * ID + ExtraData (с помощью JSON, ProtocolBuffers и т.д.). С помощью этой схемы вы можете запросить все данные с Device1 с момента времени t0 на t1 или все данные из Signal1 с t0 на t1.

Возможно, вы также хотели бы запросить идентификаторы DeviceID и SignalID от t0 до t1. Это тот случай, когда это имело бы смысл использовать составные столбцы:

CF3 
RowKey: DeviceID 
ColumnName: CompositeColumn[SignalID:SignalDateTime] 
Value: ExtraData 

Чтобы запросить эту колонку семьи вы бы выбрать строку, основанную на DeviceID и срез столбцах для SignalID и время в пределах временного диапазона. Документы pycassa объясняют некоторые из basics of composite columns.

+0

Я думал, что разделение столбцов для TimeUUID не будет работать, если я не буду использовать упорядоченный разделитель. Что (из документов) звучит как большой беспорядок, с которым нужно иметь дело. – ethrbunny

+0

Не путайте срезы столбцов и фрагменты строк. Строки для нарезки требуют упорядоченного разделителя. Но столбцы в одной строке хранятся в отсортированном порядке, так что разрезающие столбцы эффективны. – psanford

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