Кассандра длинная строка с различными типами данных

Я прочитал следующую статью о Cassandra CQL3 и Thrift API http://www.datastax.com/dev/blog/does-cql-support-dynamic-columns-wide-rows

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

В статье с CQL3 строят таблицу

CREATE TABLE data (
  sensor_id int,
  collected_at timestamp,
  volts float,
  PRIMARY KEY (sensor_id, collected_at)
) WITH COMPACT STORAGE;

что переводится как:

 sensor_id | collected_at             | volts
         1 | 2013-06-05 15:11:00-0500 |   3.1
         1 | 2013-06-05 15:11:10-0500 |   4.3
         1 | 2013-06-05 15:11:20-0500 |   5.7
         2 | 2013-06-05 15:11:00-0500 |   3.2
         3 | 2013-06-05 15:11:00-0500 |   3.3
         3 | 2013-06-05 15:11:10-0500 |   4.3

В Thrift это означает:

list data;
RowKey: 1

=> (cell=2013-06-05 15:11:00-0500, value=3.1, timestamp=1370463146717000)
=> (cell=2013-06-05 15:11:10-0500, value=4.3, timestamp=1370463282090000)
=> (cell=2013-06-05 15:11:20-0500, value=5.7, timestamp=1370463282093000)

RowKey: 2

=> (cell=2013-06-05 15:11:00-0500, value=3.2, timestamp=1370463332361000)

RowKey: 3

=> (cell=2013-06-05 15:11:00-0500, value=3.3, timestamp=1370463332365000)
=> (cell=2013-06-05 15:11:10-0500, value=4.3, timestamp=1370463332368000)

Я пытаюсь придумать пример схемы Cassandra для следующей проблемы сбора данных с датчиков. Допустим, я добавляю новый набор датчиков, которые имеют значение bigint (long) (вместо float).

Любые идеи, как разработать такую ​​схему таблицы, чтобы включить оба типа датчиков с различными типами данных, но при этом сохранить столбцы на основе метки времени?

Спасибо парень

1 ответ

Решение

Если вам не нужно использовать COMPACT STORAGE (и обратную совместимость с Thrift), просто создайте свою таблицу как

CREATE TABLE data (
  sensor_id int,
  collected_at timestamp,
  other_field bigint,
  volts float,
  PRIMARY KEY (sensor_id, collected_at)
)

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

Кроме того, вы можете продолжать использовать COMPACT STORAGE и просто переключиться на тип BLOB-объектов. Тип BLOB-объекта абсолютно не будет интерпретировать или преобразовывать байты, которые вы вставляете в него, поэтому точность может быть гарантирована. Я не рекомендовал бы использовать тип текста для этого.

Другие вопросы по тегам