Вставка произвольных столбцов в Cassandra с использованием CQL3

До CQL3 можно было вставить произвольные столбцы, такие как столбцы, имена которых указаны по дате:

cqlsh:test>CREATE TABLE seen_ships (day text PRIMARY KEY)
                WITH comparator=timestamp AND default_validation=text;
cqlsh:test>INSERT INTO seen_ships (day, '2013-02-02 00:08:22')
                VALUES ('Tuesday', 'Sunrise');

За этот пост Кажется, на CQL3 все по-другому. По-прежнему возможно вставить произвольные столбцы? Здесь моя неудачная попытка:

cqlsh:test>CREATE TABLE seen_ships (
    day text,
    time_seen timestamp,
    shipname text,
    PRIMARY KEY (day, time_seen)
);

cqlsh:test>INSERT INTO seen_ships (day, 'foo') VALUES ('Tuesday', 'bar');

Здесь я получаю Bad Request: line 1:29 no viable alternative at input 'foo'

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

cqlsh:test>CREATE TABLE seen_ships ( day text PRIMARY KEY );
cqlsh:test>INSERT INTO seen_ships (day, 'foo') VALUES ('Tuesday', 'bar');

Опять с Bad Request: line 1:29 no viable alternative at input 'foo'

Что мне здесь не хватает?

Ответ 1

В блоге Datastax есть хорошая запись в блоге об этом: http://www.datastax.com/dev/blog/does-cql-support-dynamic-columns-wide-rows

Ответ: да, CQL3 поддерживает динамические колоны, а не то, как он работал в более ранних версиях CQL. Я не совсем понимаю ваш пример, вы смешиваете datestamps со строками, так что я не вижу, как это работает на CQL2. Если я правильно вас понимаю, вы хотите составить временную шкалу судовых наблюдений, где ключ раздела (строка строки) - это день, и каждое наблюдение представляет собой пару времени/имени. Вот предложение:

CREATE TABLE ship_sightings (
  day TEXT,
  time TIMESTAMP,
  ship TEXT,
  PRIMARY KEY (day, time)
)

И вы вставляете записи с

INSERT INTO ship_sightings (day, time, ship) VALUES ('Tuesday', NOW(), 'Titanic')

однако, скорее всего, вы должны использовать TIMEUUID вместо TIMESTAMP (и первичный ключ может быть DATE), так как в противном случае вы можете добавить два наблюдения с одинаковой меткой времени и только один из них сохранится.

Это был пример широких строк, но тогда возникла проблема с динамическими столбцами, что не совсем одно и то же. Вот пример этого в CQL3:

CREATE TABLE ship_sightings_with_properties (
  day TEXT,
  time TIMEUUID,
  ship TEXT,
  property TEXT,
  value TEXT,
  PRIMARY KEY (day, time, ship, property)
)

который вы можете вставить следующим образом:

INSERT INTO ship_sightings_with_properties (day, time, ship, property, value)
VALUES ('Sunday', NOW(), 'Titanic', 'Color', 'Black')
# you need to repeat the INSERT INTO for each statement, multiple VALUES isn't
# supported, but I've not included them here to make this example shorter
VALUES ('Sunday', NOW(), 'Titanic', 'Captain', 'Edward John Smith')
VALUES ('Sunday', NOW(), 'Titanic', 'Status', 'Steaming on')
VALUES ('Monday', NOW(), 'Carapathia', 'Status', 'Saving the passengers off the Titanic')

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

Наконец, заметка о коллекциях на CQL3. Они являются полезной функцией, но они не способ реализовать широкие строки или динамические столбцы. Прежде всего, у них есть предел в 65536 пунктов, но Cassandra не может применять этот предел, поэтому, если вы добавите слишком много элементов, вы, возможно, не сможете их прочитать позже. Коллекции в основном предназначены для небольших полей с несколькими значениями. Канонический пример - это адресная книга, в которой каждая строка является записью и где записи имеют только одно имя, но несколько телефонных номеров, адреса электронной почты и т.д.

Ответ 2

Это не действительно динамический столбец, но чаще всего вы можете обойтись с коллекциями. Используя столбец "Карта", вы можете сохранить некоторые динамические данные