将动态Cassandra柱族转换为静态柱族

将动态Cassandra柱族转换为静态柱族,cassandra,cql,cassandra-cli,Cassandra,Cql,Cassandra Cli,假设我在Cassandra中有一个列族,它是使用Cassandra cli创建的,如下所示: create column family users with key_validation_class = UTF8Type and comparator = UTF8Type; CREATE TABLE users ( key text, column1 text, value blob, PRIMARY KEY (key, column1) ) WITH COMPACT STOR

假设我在Cassandra中有一个列族,它是使用
Cassandra cli
创建的,如下所示:

create column family users with key_validation_class = UTF8Type and comparator = UTF8Type;
CREATE TABLE users (
  key text,
  column1 text,
  value blob,
  PRIMARY KEY (key, column1)
) WITH COMPACT STORAGE
  AND CLUSTERING ORDER BY (column1 ASC);
就结构而言,这是一个动态柱族

从CQL3客户端使用
描述表用户查看时,如下所示:

create column family users with key_validation_class = UTF8Type and comparator = UTF8Type;
CREATE TABLE users (
  key text,
  column1 text,
  value blob,
  PRIMARY KEY (key, column1)
) WITH COMPACT STORAGE
  AND CLUSTERING ORDER BY (column1 ASC);
这是预期的行为。我想要的是添加列元数据,以便将列族视为静态的

因此,我使用cassandra cli尝试了以下方法:

update column family users
  with column_metadata = [{column_name: email, validation_class: UTF8Type}];
然而,CQL3的最终结果并不是我想要的:

CREATE TABLE users (
  key text,
  column1 text,
  value blob,
  email text,
  PRIMARY KEY (key, column1)
) WITH COMPACT STORAGE
  AND CLUSTERING ORDER BY (column1 ASC);
我期望的结果与我从一开始就使用元数据创建列族时的结果相同:

create column family users2 
  with key_validation_class = UTF8Type
  and comparator = UTF8Type
  and column_metadata = [{column_name: email, validation_class: UTF8Type}];
在这种情况下,我想要的是CQL3视图:

CREATE TABLE users2 (
  key text PRIMARY KEY,
  email text
) WITH COMPACT STORAGE;

是否有某种方法可以将列元数据添加到未创建任何列族的列族中,以便从CQL3查看它,就像创建列族时提供元数据一样?当然,在不重新创建列族的情况下。

不可能使用旧的节约API创建静态列。事实上,静态列只是一个技巧,例如,集群值为NULL的列,因此每个分区键只有一个实例

请参阅这两张幻灯片了解说明(抱歉,法语文本):


您应该借此机会迁移到CQLThrift是不推荐使用的,甚至在默认情况下从Cassandra 3.x开始禁用它。查看系统键空间,表模式列族

我认为分区键和集群列的标签存储在那里

也许可以改变它们,但我不知道直接侵入这些元表是否是个好主意

如果有n节点,则可能需要更新所有这些节点上的标签,因为系统键空间具有LocalStrategy

执行此查询以查看实际标签:

SELECT key_aliases,key_validator,column_aliases,comparator 
FROM system.schema_columnfamilies
WHERE keyspace_name='xxx'
AND columnfamily_name='users';

我使用的不是静态列,而是每行中都有相同列的列族。术语“静态柱族”是在中定义的。我正在从Thrift迁移到CQL-我只想在CQL查询中拥有比
column1
value
更好的列名。请参阅下面的完整答案感谢为我指明了正确的方向(系统架构表)。从我的问题来看,表
users
users2
之间唯一的显著区别是
users
schema\u column家族中的
has
has
has
is\u dense=False
。然而,除了修改系统表之外,似乎没有简单的方法来做我想做的事情,而且我觉得这样做不舒服。@st_Patrick,你解决了你的问题吗?试图修改
系统
表,但未成功。