Подтвердить что ты не робот

SELECT Конкретное значение с карты

Я пытаюсь создать таблицу WIDE Column Table, 20 000+ столбцов

Сначала я думал, что буду использовать:

CREATE TABLE details (
   key TEXT,
   detail map<TEXT, TEXT>
   PRIMARY KEY (KEY)
  );

Вставка в эту таблицу отлично работает

UPDATE details SET detail = detail + { 'col1': '12'} where key='123' ;
UPDATE details SET detail = detail + { 'col20000': 'ABCD'} where key='123' ;

Однако я хотел бы прочитать индивидуальную деталь:

   select detail[col1] where key='123'

при выполнении этого запроса я получаю следующую ошибку:

 no viable alternative at input '['

Будет ли это работать, или мне нужен другой подход?

4b9b3361

Ответ 1

Коллекции представляют собой небольшие группы данных, которые вы извлекаете сразу.

Если вы хотите получить доступ к кортежам на более тонком уровне и по-прежнему сможете спросить "какие все пары данных для данного ключа", вы должны использовать таблицу следующим образом:

CREATE TABLE details (
  key TEXT,
  detail_key text,
  detail_value text,
  PRIMARY KEY (key, detail_key)
);

Это позволит SELECT * FROM details WHERE key = ?, а также SELECT * FROM detail WHERE key = ? AND detail_key = ?.

Ответ 2

В основном эта функциональность еще не поддерживается Кассандрой.

Посмотреть эту коллекцию cql3

Ответ 3

Вы можете использовать определяемый пользователем тип вместо типа карты. Попробуйте определить таблицу следующим образом:

CREATE TYPE detailtype (
    col1 TEXT,
    col2 TEXT
);

CREATE TABLE details (
   key TEXT,
   detail frozen<detailtype>,
   PRIMARY KEY (KEY)
);

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

select detail.col1 where key='123';