【问题标题】:How do I take the advantage of the variable column key/value structure of Cassandra如何利用 Cassandra 的可变列键/值结构
【发布时间】:2013-06-28 00:19:02
【问题描述】:

如果我必须预定义所有列,如何利用 cassandra 的可变列键/值结构?如果我使用更新表命令,它将为所有没有该列的行插入空值。这与关系数据库相同。

例如,对于联系人列族,我有姓名、电话、电子邮件。我有 100 个联系人拥有所有 3 个字段。然后 101 号联系人有我想添加的 Skype id。如果我使用插入语句,它不会让我添加 skypeid,因为它没有在 CF 中定义。所以我必须运行 alter 语句来更改 CF,然后所有前 100 个联系人都将有一个空字段。

【问题讨论】:

  • 你能发布你正在使用的命令吗?的确,在 cassandra 中,您可以轻松地在一行中插入和更新可变数量的列。
  • 例如,对于联系人列family,我有姓名、电话、电子邮件。我有 100 个联系人拥有所有 3 个字段。然后 101 号联系人有我想添加的 Skype id。如果我使用插入语句,它不会让我添加 skypeid,因为它没有在 CF 中定义。所以我必须运行 alter 语句来更改 CF,然后所有前 100 个联系人都将有一个空字段。
  • 一些文档说我们可以使用复合键在 CQL3 中对动态列进行建模。我只是不明白它们是如何相关的或如何做到这一点。

标签: cassandra


【解决方案1】:

Thrift API 可以即时创建列。例如,在 Astyanax 中,您可以插入未在架构中定义的列。但这仍然会使您的前 100 列有效地为该列保留一个空值,因此没有真正的理由避免更新架构和一些缺点。这就是 CQL 强制“先告诉模式”的原因。

现在,如果您需要处理真正的动态字段,您可以在 CQL 中使用 collections。但在您的示例中并非如此。

【讨论】:

    【解决方案2】:

    如果我使用插入语句,它不会让我添加 skypeid,因为它没有在 CF 中定义。所以我必须运行 alter 语句来更改 CF,然后前 100 个联系人的每个人都有一个空字段

    但也许不是问题。 DataStax documentation for CQL3 INSERT

    INSERT 在 Cassandra 表中以原子方式和隔离方式将一个或多个列写入记录。不返回任何结果。您不必定义所有列,构成键的列除外。 缺少的列不占用磁盘空间

    【讨论】:

      猜你喜欢
      • 2011-02-03
      • 2019-10-08
      • 2013-09-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-22
      • 1970-01-01
      • 2022-01-04
      相关资源
      最近更新 更多