Модель данных временных рядов Cassandra

Допустим, 10 устройств (dev01, dev02, dev03 и т. д.).

Он отправляет данные с некоторым интервалом времени, мы собираем эти данные, поэтому наша схема данных

 dev01      :int
 signalname :string
 signaltime :date/time[with YY-MM-DD HHMMSS.mm]
 Extradata  :String

Я хочу передать данные в cassandra, как лучше всего хранить эти данные?

Мой запрос похож на

1 Нужно получить данные текущего дня на основе устройства или с некоторым диапазоном дат?

2 5 Данные устройства за текущий день?

Я не уверен, что следующий способ хранения данных в cassadra - лучшая модель.

Standard columnfamily Name:signalname
row key                   :dev01
columnname                :timeseries(20120801124204)[YYMMDD HHMMSS]
columnvalue               :Json data
columnname                :timeseries(20120801124205)[YYMMDD HHMMSS][next second data]
columnvalue               :Json data

row key               :dev02
columnname            :timeseries(20120801124204)[YYMMDD HHMMSS]
columnvalue           :Json data
columnname            :timeseries(20120801124205)[YYMMDD HHMMSS][next second data]
columnvalue           :Json data

Or  

Super columnfamily   :signalname
row key              :Clientid1

supercolumnname      :dev01
columnname           :timeseries(20120801124204)[YYMMDD HHMMSS]
columnvalue          :Json data

supercolumnname      :dev02
columnname           :timeseries(20120801124204)[YYMMDD HHMMSS]
columnvalue          :Json data


row key              :Clientid2

supercolumnname      :dev03
columnname           :timeseries(20120801124204)[YYMMDD HHMMSS]
columnvalue          :Json data

supercolumnname      :dev04
columnname           :timeseries(20120801124204)[YYMMDD HHMMSS]
columnvalue          :Json data

Пожалуйста, помогите мне в этом вопросе, любым другим способом?

Спасибо и С уважением, Каннадхасан


person kannadhasan    schedule 01.08.2013    source источник


Ответы (1)


Я вижу 3 проблемы с вашим подходом, которые я рассмотрю ниже:

  • семейства суперстолбцов,
  • бережливость против cql3,
  • json данные как значения ячеек.

Прежде чем продолжить: не рекомендуется использовать семейства суперстолбцов. Подробнее читайте здесь. Составные ключи (как описано ниже) — это то, что нужно.

Кроме того, вам может понадобиться ознакомиться с CQL3, поскольку thrift — это устаревший API, начиная с версии 1.2.

Вместо хранения данных в формате json вы можете использовать нативные типы данных коллекции, такие как списки, карты и т. д.. Если вы все еще хотите работать с JSON, есть улучшена поддержка JSON в Cassandra, начиная с версии 2.2.

В общем, довольно просто выполнить запрос для каждого устройства и периода времени:

  • ваш ключ строки будет идентификатором устройства, а ключ столбца - timeuuid
  • Чтобы избежать горячих точек, вы можете добавить счетчики «сегмента» к ключу строки (создать составной ключ строки/раздела), чтобы вращать узлы.
  • Затем вы можете запросить временные диапазоны, если знаете идентификатор строки/устройства.

В качестве альтернативы вы можете использовать свой тип сигнала в качестве ключа строки (и timeuuid/timestamp в качестве ключа столбца), если вы хотите запрашивать данные для нескольких устройств (но одного типа события) одновременно. Подробнее о данных временных рядов в cassandra читайте в эта запись в блоге.

Надеюсь, это поможет!

person John    schedule 01.08.2013
comment
спасибо omnibear, поэтому вы предложили использовать составной первичный ключ семейства столбцов в качестве идентификатора устройства, отметку времени следует за именем столбца, значением столбца - person kannadhasan; 02.08.2013
comment
в то время как мы используем cql3 для чтения однострочного ключа с записью временной серии 10000, для 4 столбцов требуется почти 8 минут, производительность низкая - person kannadhasan; 02.08.2013
comment
Не могли бы вы обновить свой вопрос выше, чтобы отразить эти последние изменения? Например, не могли бы вы дать свой оператор создания таблицы CQL3? В противном случае трудно дать полезный ответ. - person John; 02.08.2013
comment
Составной ключ строки означает: два значения объединяются в один ключ строки/раздела, например, deviceid и Bucket. create table ..... primary key((deviceid, bucket), signaltime). Все ключи столбца (здесь: signaltime) по умолчанию являются составными ключами столбца, если их несколько (здесь это не так). Если у вас есть составной ключ столбца, вы можете выполнять запросы диапазона только для последнего ключа столбца. Первый должен быть запрошен с помощью оператора EQ. - person John; 02.08.2013
comment
CREATE COLUMNFAMILY deviceidcomposite(did varchar,signalid varchar,lat varchar,lan varchar,timestamp varchar,PRIMARY KEY (did,timestamp)) - person kannadhasan; 02.08.2013
comment
1) Измените временную метку varchar на timeUUID или тип данных временной метки. 2) Используйте этот ключ столбца в своем запросе и еще раз проверьте производительность. (Например, select * from deviceidcomposite where did = 0 and timestamp > 1375429645 and timestamp < 1375160400;) 3) Если вы используете метку времени/timeuuid, всегда используйте UTC+0 в качестве часового пояса, чтобы избежать проблем в распределенной среде. - person John; 02.08.2013