Требует ли CQL3 схему для Cassandra сейчас?

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

Сейчас я пробую CQL3, и кажется, что я больше не могу вставлять в столбцы, которые не определены в схеме, или видеть эти столбцы в select *

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


person Arne Claassen    schedule 09.10.2012    source источник


Ответы (4)


Да, CQL3 требует объявления столбцов перед использованием.

Но вы можете делать столько ALTER, сколько хотите, без блокировки или снижения производительности.

Тем не менее, большинство мест, где вы использовали бы «динамические столбцы» в более ранних версиях C*, лучше обслуживаются картой в C* 1.2.

person jbellis    schedule 09.10.2012
comment
Спасибо за указание на карту. Но как насчет динамических столбцов, созданных до версии 1.2? Я имею в виду, что в этом случае нам пришлось бы перенести эти динамические столбцы на карты, верно? И если это правда, и если мы все еще хотим запрашивать столбцы, не определенные в схеме до версии 1.2 в CQL3, как нам это сделать? - person vaidik; 19.12.2012
comment
Yikes: Большинство мест, где вы использовали "динамические столбцы" в более ранних версиях C*, лучше обслуживаются картой в C* 1.2. Это, откровенно говоря, плохой совет, учитывая, что в документации по коллекциям CQL указано следующее: никогда не вставляйте в коллекцию более 64 КБ элементов. Если вы вставите в коллекцию более 64 КБ элементов, только 64 КБ из них будут доступны для запросов, что приведет к потере данных. datastax.com/documentation/cql/3.0/webhelp/ cql/cql_using/ - person crispyduck; 04.02.2014
comment
Я использую динамические столбцы в том смысле, в каком их использовал Арне: я не хочу определять каждый атрибут перед его использованием. Большинство из этих случаев действительно лучше всего обслуживаются коллекцией. Я более подробно изучаю другие варианты использования на странице datastax. .com/dev/блог/ - person jbellis; 06.02.2014
comment
@crispyduck 1) ссылка мертва, 2) на самом деле это звучит идеально для меня. У меня есть вариант использования, когда я не знаю имена столбцов заранее и не хочу проверять, какие имена столбцов существуют каждый раз, когда добавляется новое значение, и Можно разумно предположить, что никогда не будет экземпляра, в котором требуется более 64 КБ элементов на строку, и иметь имена столбцов, которые будут сильно различаться в каждой строке (т. е. редко заполняться при просмотре как «традиционная» таблица). - person aroth; 11.01.2016

Я предлагаю вам изучить составные колонки с «КОМПАКТНЫМ ХРАНЕНИЕМ». Семейство столбцов COMPACT STORAGE позволяет определить практически только ключевые столбцы:

Пример:

СОЗДАЙТЕ ТАБЛИЦУ entity_cargo (entity_id ascii, item_id ascii, qt ascii, PRIMARY KEY (entity_id, item_id)) С КОМПАКТНЫМ ХРАНИЛИЩЕМ

На самом деле, когда вы вставляете разные значения из itemid, вы не добавляете строку с entity_id, item_id и qt, а добавляете столбец с именем (содержимое item_id) и значением (содержимое qt). Так:

вставить в entity_cargo (entity_id,item_id,qt) значения(100,'oggetto 1',3);

вставить в entity_cargo (entity_id,item_id,qt) значения(100,'oggetto 2',3);

А вот как вы видите эти строки в CQL3:

cqlsh:goh_master> выберите * из entity_cargo, где entity_id = 100;

идентификатор объекта | item_id | кварт

-----------+-----------+----

  100 | oggetto 1 |  3

  100 | oggetto 2 |  3

А как они если проверить тнем из кли:

[по умолчанию@goh_master] получить entity_cargo[100];

=> (столбец = oggetto 1, значение = 3, отметка времени = 1349853780838000)

=> (столбец = oggetto 2, значение = 3, отметка времени = 1349853784172000)

Возвращает 2 результата.

Вы можете получить доступ к одному столбцу с помощью

выберите * из entity_cargo, где entity_id = 100 и item_id = 'oggetto 1';

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

person Alar    schedule 10.10.2012

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

Устаревшая поддержка

Семейство динамических столбцов, определенное с помощью Thrift с помощью следующей команды (обратите внимание, что нет метаданных, специфичных для столбца):

create column family clicks
  with key_validation_class = UTF8Type
  and comparator = DateType
  and default_validation_class = UTF8Type

Вот точный эквивалент в CQL:

CREATE TABLE clicks (
  key text,
  column1 timestamp,
  value text,
  PRIMARY KEY (key, column1)
) WITH COMPACT STORAGE

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

CQL-дополнения

Кроме того, CQL предоставляет возможность назначать метки идентификатору строки, столбцу и элементам значения, чтобы указать, что сохраняется. Следующий альтернативный способ определения той же самой структуры в CQL подчеркивает эту функцию на примере DataStax — семейство столбцов, используемое для хранения кликов пользователей на веб-сайте, упорядоченных по времени:

CREATE TABLE clicks (
  user_id text,
  time timestamp,
  url text,
  PRIMARY KEY (user_id, time)
) WITH COMPACT STORAGE

Примечания

  • Таблица в CQL всегда сопоставляется с Семейством столбцов в Thrift
  • драйвер CQL использует первый элемент определения первичного ключа в качестве ключа строки
  • Составные столбцы используются для реализации дополнительных столбцов, которые можно определить в CQL.
  • использование WITH COMPACT STORAGE не рекомендуется для новых дизайнов, так как оно фиксирует количество возможных столбцов. Другими словами, ALTER TABLE ... ADD для такой таблицы невозможен. Просто оставьте это, если это не абсолютно необходимо.
person Alexandre D'Erman    schedule 15.01.2014

интересно, что-то я не знал о CQL3. В PlayOrm идея состоит в том, что это «частичная» схема, которую вы должны определить, и в предложении WHERE выбора вы можете использовать только то, что определено в частичной схеме, НО она возвращает ВСЕ данные строк, ДАЖЕ данные, которые они не знает о .... Я ожидал, что CQL должен был делать то же самое :( Мне нужно изучить это сейчас. спасибо, Дин

person Dean Hiller    schedule 09.10.2012