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 '['
Будет ли это работать, или мне нужен другой подход?
Ответы
Ответ 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';