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

时间:2016-01-18 11:56:21

标签: cassandra cql cassandra-cli

我们假设我在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中查看它,就像创建列族时提供元数据一样?当然,无需重新创建列族。

2 个答案:

答案 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';