【问题标题】:Cassandra: can I index and query along a third dimension?Cassandra:我可以沿第三个维度进行索引和查询吗?
【发布时间】:2016-02-06 01:15:47
【问题描述】:

我想为 Cassandra 中的查询设置第三维度标准。它已经允许高效的二维查询,因为它不仅是一个键值存储,而且实际上是一个键值存储。那就是:

简单的键值存储:

键-键-值存储:

所以 Cassandra 的吸引力在于,给定 keyA 的值,我可以沿 keyB 执行非常有效的范围查询,因为它们是连续存储的。

现在是否有可能在给定 keyA 和 keyB 的情况下也有一个沿第三维的索引,比如 keyC,以便我可以限制基于 keyC 返回的值?

所以本质上:

基本上给定 keyA,比如 keyA-1,以及一系列 KeyB,比如 keyB-2 到 keyB-4,我只想返回与 keyC-3 对应的值,如上图绿色所示。

我知道这是可能的,因为即使是简单的键值存储也可以使用多个索引来实现。问题是,它是否高效。我还能沿着 keyB 执行非常快速的范围查询吗?

我的用例是时间序列,我想在其中存储同一序列的分钟分辨率和每日分辨率数据。所以 keyA 是我想要的系列,keyB 是当天,keyC 是分钟。我想这样做是因为将所有内容存储为分钟意味着如果我需要每日数据,这意味着通过网络(每天 24 * 60 分钟,我只想要其中一个)获取太多数据到内存中,以及大量的客户端聚合。

我知道我可以将分钟和每天存储在单独的表中,但这会在一定程度上限制我的灵活性,更不用说架构的简洁性了。

如果这在 Cassandra 中并不容易/高效,那么这在 RIAK TS 中是否可行?

【问题讨论】:

  • 太长无法阅读但是:您的集群可以是复合的,因此您可以执行 key-(key-...-key) - value。

标签: cassandra cassandra-2.0 riak


【解决方案1】:

基本上给定 keyA,比如 keyA-1,以及一系列 KeyB,比如 keyB-2 到 keyB-4,我只想返回与 keyC-3 对应的值,如上图绿色所示。

是的,可以使用以下表格结构

CREATE TABLE data (
     keyA text,
     keyC text,
     keyB int,
     val double,
     PRIMARY KEY ((keyA), keyC, keyB)
);

 SELECT * FROM data WHERE keyA='xxx' AND keyC='yyy' AND keyB>=aaa AND keyB<=bbb;

这个表的抽象可以看成:

Map<KeyA,SortedMap<KeyC,SortedMap<KeyB,val>>>  

keyA 是我想要的系列,keyB 是当天,keyC 是分钟

因此,基本上,通过上表,您可以回答以下问题:给我所有的系列 S (keyA)、分钟 M (keyC) 和日期 (keyB) 在 X 和 Y 之间的值 非常非常高效,因为它会导致顺序扫描...

现在唯一的问题是,仅基于 serie ID (keyA) 的分区键会变得非常大。

一种解决方案是按年份拆分,例如具有像PRIMARY KEY((keyA, year), keyC, keyB) 这样的复合分区键。这将对您的查询施加额外的限制:您必须每次都提供系列 ID 和年份

【讨论】:

    猜你喜欢
    • 2021-06-10
    • 2018-11-10
    • 2012-06-28
    • 2015-05-30
    • 2011-04-06
    • 2015-07-31
    • 1970-01-01
    • 2010-11-15
    • 2014-01-19
    相关资源
    最近更新 更多