Согласно документации datastx здесь, мы не можем удалить столбец из таблиц, определенных с опцией COMPACT STORAGE. Что является причиной этого?
В Cassandra, почему удаление столбца из таблиц, определенных с компактным хранилищем, не разрешено?
Ответы (1)
Это восходит к исходной реализации CQL3 и изменениям, которые были внесены, чтобы позволить ему абстрагировать подобную SQL структуру с широкими строками поверх исходного механизма хранения на основе Thrift. В конечном счете, управление схемой сводится к тому, является ли базовая структура таблицей или column_family.
В качестве примера я создам две таблицы, используя старую установку Apache Cassandra (2.1.19):
CREATE TABLE student (
studentid TEXT PRIMARY KEY,
fname TEXT,
name TEXT);
CREATE TABLE studentcomp (
studentid TEXT PRIMARY KEY,
fname TEXT,
name TEXT)
WITH COMPACT STORAGE;
Я вставлю по одной строке в каждую таблицу:
INSERT INTO student (studentid, fname, lname) VALUES ('janderson','Jordy','Anderson');
INSERT INTO studentcomp (studentid, fname, lname) VALUES ('janderson','Jordy','Anderson');
А потом посмотрю на таблицы старым инструментом cassandra-cli:
[default@stackoverflow] list student;
Using default limit of 100
Using default cell limit of 100
-------------------
RowKey: janderson
=> (name=, value=, timestamp=1599248215128672)
=> (name=fname, value=4a6f726479, timestamp=1599248215128672)
=> (name=lname, value=416e646572736f6e, timestamp=1599248215128672)
[default@stackoverflow] list studentcomp;
Using default limit of 100
Using default cell limit of 100
-------------------
RowKey: janderson
=> (name=fname, value=Jordy, timestamp=1599248302715066)
=> (name=lname, value=Anderson, timestamp=1599248302715066)
Вы видите пустое/призрачное значение столбца в первом результате? Это пустое значение столбца было связующим звеном CQL3 между значениями столбца и метаданными таблицы. Если его нет, то CQL нельзя использовать для управления столбцами таблицы.
Компаратор, используемый для преобразования типов, был единственным, что действительно было доступно через Thrift. Это отсутствие контроля/отсутствия доступа к метаданным позволило Cassandra считаться бессхемной в дни, предшествовавшие CQL. Если я запускаю describe studentcomp
из cassandra-cli, я вижу используемые компараторы (класс проверки):
Column Metadata:
Column Name: lname
Validation Class: org.apache.cassandra.db.marshal.UTF8Type
Column Name: fname
Validation Class: org.apache.cassandra.db.marshal.UTF8Type
Но если я попробую describe student
, я увижу это:
WARNING: CQL3 tables are intentionally omitted from 'describe' output.
See https://issues.apache.org/jira/browse/CASSANDRA-4377 for details.
Sorry, no Keyspace nor (non-CQL3) ColumnFamily was found with name: student (if this is a CQL3 table, you should use cqlsh instead)
По сути, таблицы и семейства столбцов были разными объектами, помещенными в одно и то же ведро. Добавление WITH COMPACT STORAGE
фактически сделало таблицу семейством столбцов. С этим связано отсутствие какого-либо управления схемой (добавление или удаление столбцов), кроме доступа к компараторам.
Изменить 20200905
Можем ли мы как-то/как-нибудь (взломать) удалить столбцы из таблицы?
У вас возможно это получится. Сильвен Лебрейн написал Руководство по переходу на CQL3 Thrift to CQL3, которое будет иметь некоторые необходимые детали для вас. Я также советую прочитать упомянутый выше тикет Jira (CASSANDRA-4377), поскольку это охватывает многие глубокие технические проблемы, которые усложняют это.