我们假设我在Cassandra中有一个使用cassandra-cli
创建的列系列,如下所示:
create column family users with key_validation_class = UTF8Type and comparator = UTF8Type;
就thrift to CQL3 migration guide from Datastax而言,这是动态列系列。
使用DESCRIBE TABLE users
从CQL3客户端查看时,它看起来像这样:
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中查看它,就像创建列族时提供元数据一样?当然,无需重新创建列族。
答案 0 :(得分:1)
使用旧 Thrift API无法创建静态列。实际上,静态列只是一个技巧,例如具有聚簇值= NULL的列,因此每个分区键只有一个实例。
请参阅这两张幻灯片以获得解释(法语中的抱歉文字):
http://www.slideshare.net/doanduyhai/cassandra-techniques-de-modlisation-avance/218
http://www.slideshare.net/doanduyhai/cassandra-techniques-de-modlisation-avance/219
您应该借此机会迁移到CQL。不推荐使用 Thrift ,默认情况下禁用默认情况下,从 Cassandra 3.x
开始答案 1 :(得分:1)
好的,我明白你的意思了。查看系统键空间,表 schema_columnfamilies 。
我认为分区键和群集列的标签存储在那里。
可能有可能改变它们,但我不知道直接入侵这些元表是否是个好主意。
如果您有 n 节点,则可能需要更新所有节点上的标签,因为系统键空间具有 LocalStrategy 。
执行此查询以查看实际标签:
SELECT key_aliases,key_validator,column_aliases,comparator
FROM system.schema_columnfamilies
WHERE keyspace_name='xxx'
AND columnfamily_name='users';