如何解决在Cassandra中,为什么不允许从使用紧凑存储定义的表中删除列?
根据datastx文档here,我们无法从使用COMPACT STORAGE选项定义的表中删除列。是什么原因呢?
解决方法
这可以追溯到CQL3的原始实现,并进行了一些更改,使其可以在原始的基于Thrift的存储引擎之上抽象出“类似于SQL”的宽行结构。最终,对模式的管理取决于底层结构是表还是 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,name TEXT)
WITH COMPACT STORAGE;
我将在每张表中插入一行:
INSERT INTO student (studentid,fname,lname) VALUES ('janderson','Jordy','Anderson');
INSERT INTO studentcomp (studentid,'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)
您是否在第一个结果中看到empty /“ ghost”列的值?空列值是CQL3在列值和表的元数据之间的链接。如果不存在,则无法使用CQL管理表的列。
用于类型转换的比较器实际上是通过Thrift公开的。由于缺少元数据控制/暴露,因此在CQL之前的日子里,Cassandra被视为“无精打采”。如果我在cassandra-cli中运行describe studentcomp
,则可以看到使用的比较器(验证类):
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
我们可以/以某种方式(破解)从表中删除列吗?
您可能能够完成此任务。 Sylvain Lebresne撰写了A Thrift to CQL3 Upgrade Guide,其中将为您提供一些必要的详细信息。我还建议您仔细阅读上述(CASSANDRA-4377)的Jira票证,因为它涵盖了许多使这变得困难的深入技术难题。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。