【问题标题】:select compositetype keys in cassandra在 cassandra 中选择复合类型键
【发布时间】:2012-07-28 12:58:44
【问题描述】:

所以我定义了一个使用复合 ID 作为行键的列族。所以说复合键是CompositeType(LongType,LongType)。因此,我已经测试了使用这种类型存储项目并且工作正常,SELECT 在我知道完整密钥时也可以按预期工作。但是可以说我想要所有具有 0 作为第一个元素和任何作为第二个元素的键。到目前为止,我可以看到执行此查询的唯一方法如下:

如果我的所有键都是 0:*,那么我会为 key >= 0:0 AND key < 1:0 执行 CQL 查询,只要有一个保留顺序的分区程序就可以工作。

我的问题是:

1) 这种奇怪的语法只是因为我使用的是 CQL 驱动程序(nodejs 的唯一选项,除了 thrift)

2) 这种类型的查询有没有效率低下?本质上,我使用的是复合键而不是超级列,因为 CQL 不支持这些列。只要像这样使用它没有任何限制,我在代码中处理这个逻辑就没有问题。

【问题讨论】:

    标签: node.js cassandra cql composite-types


    【解决方案1】:

    我建议您更改数据模型。使用 RandomPartitioner 并将第一个组件作为行键。将第二个组件推送到列名中,即使您的列名组合起来。

    由于列名总是排序的,您可以进行简单的切片操作。例如,

    a) 当您知道这两个组件时,对行键(第一个组件)和复合的第一个组件执行获取切片。

    b) 当您只知道第一个组件时,获取行键的完整行(第一个组件)

    这是 CQL3 在您要求它创建具有多个主键的表时所采用的方法。

    【讨论】:

    • 你是对的,尽管有任何理由不使用行键,但它可以在使用列而不是行键作为组合方面起作用?我知道即使数据分布均匀,排序也会导致负载不平衡的问题。但我所有的密钥都以至少 8 个字节的 sha1 开头,这应该可以消除这个问题。
    • 现在我记得我在这里的推理,所以从你所说的我知道我可以将键作为 LongType,现在列可以是 CompositeType(LongType,UTF8Type)。但是,如果它们不完全相同,我现在不是失去了声明值类型的能力吗?就像一列是长值而另一列是 utf8 值一样,我现在是否需要说所有列都是 BytesType,因为我不再有静态列名?然后我失去了 cassandra 为我进行类型转换的功能,对吗?我在这里错过了什么吗?
    • 根据我的理解,您将有两个选择,如您所说的存储为字节,另一个是使用动态组合来存储值。 DC 允许您拥有具有不同数据类型的单个组件。
    【解决方案2】:

    您最好的选择是使用CQL 3。这将允许您在下面使用复合来优化查找,同时仍然允许您使用复合值的各个部分,就好像它们是单独的列一样。您当前在行键中使用复合,而 CQL 3 仅支持列名 (so far) 中的复合,但可能没问题。在许多这样的情况下,将合成从行键转移到列名不会对您的性能或数据分布产生不利影响,但如果您的行键没有足够的选择性,那么它可能会。

    不过,无论哪种方式,您都应该关注 CQL 3。CQL 2 已被弃用。如果我更了解您的情况,我可以告诉您更多关于如何使您的模型适应 CQL 3 的信息。

    【讨论】:

      猜你喜欢
      • 2014-05-26
      • 2012-12-28
      • 2013-12-31
      • 2012-11-16
      • 1970-01-01
      • 2019-10-14
      • 2013-09-04
      • 2018-01-15
      • 2015-04-04
      相关资源
      最近更新 更多