【问题标题】:Convert dynamic Cassandra column family to static one将动态 Cassandra 列族转换为静态列族
【发布时间】:2016-01-18 22:57:11
【问题描述】:

假设我在 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 中查看它的方式与创建列族时提供元数据的方式相同?当然,无需重新创建列族。

【问题讨论】:

    标签: cassandra cql cassandra-cli


    【解决方案1】:

    无法使用 old Thrift API 创建 static 列。实际上,静态列只是一个技巧,例如具有聚类值 = NULL 的列,因此每个分区键只有 1 个实例。

    请参阅这 2 张幻灯片以了解说明(对不起,法语文本):

    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

    开始默认禁用

    【讨论】:

    • 我使用的不是静态列,而是每行都有相同列的列族。在thrift to CQL3 migration guide 中定义了术语静态列族。我正在从 Thrift 迁移到 CQL - 我只想在 CQL 查询中使用比 column1value 更好的列名。
    • 查看下面的完整答案
    【解决方案2】:

    好的,我明白你的意思了。查看 system 键空间,表 schema_columnfamilies

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

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

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

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

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

    【讨论】:

    • 感谢您为我指明正确的方向(系统架构表)。我的问题中表usersusers2 之间的唯一显着区别是usersschema_columnfamilies 中具有is_dense = True,而users2 具有is_dense = False。然而,除了修改系统表之外,似乎没有简单的方法可以做我想做的事——而且我觉得这样做不太舒服。
    • @st_patriick,你的问题解决了吗?尝试修改system 表没有成功。
    猜你喜欢
    • 2013-09-18
    • 2020-05-28
    • 1970-01-01
    • 1970-01-01
    • 2013-01-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-24
    相关资源
    最近更新 更多