在cassandra中,为什么不允许从使用紧凑存储定义的表中删除列?

eit6fx6z  于 2021-06-09  发布在  Cassandra
关注(0)|答案(1)|浏览(298)

根据这里的datastx文档,我们不能从使用压缩存储选项定义的表中删除列。原因是什么?

qcuzuvrc

qcuzuvrc1#

这可以追溯到cql3的原始实现,并对其进行了更改,使其能够在原始的基于节约的存储引擎之上抽象出一个“类似sql”的宽行结构。最终,管理模式归结为底层结构是表还是列族。
作为一个示例,我将使用ApacheCassandra(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)

您看到第一个结果中的空/“ghost”列值了吗?该空列值是cql3在列值和表元数据之间的链接。如果不存在,那么cql就不能用于管理表的列。
用于类型转换的比较器是通过节俭真正暴露出来的。这种缺乏元数据控制/暴露的情况使得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
我们能从表中删除列吗?
你也许能做到这一点。sylvainlebresne写了一个节俭到cql3的升级指南,它将为您提供一些必要的细节。我还建议通读上面提到的jira票据(cassandra-4377),因为它涵盖了许多使之困难的深入的技术挑战。

相关问题