Cassandra:我可以沿第三维索引和查询吗?

时间:2016-02-05 16:05:27

标签: cassandra cassandra-2.0 riak

我想在Cassandra中为查询添加第三个维度标准。它已经提供了高效的2-d查询,因为它不仅仅是键值存储,而且实际上是键 - 键值存储。那就是:

简单的键值存储:

enter image description here

键 - 键值存储:

enter image description here

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

现在,在给定keyA和keyB的情况下,还有一个沿着第三维的索引,比如keyC,这样我可以根据keyC限制返回哪些值?

基本上是这样的:

enter image description here

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

我知道这是可能的,因为即使是一个简单的键值存储也可以使用多个索引。问题是,它是否高效。我还能在keyB上执行真正的快速查询吗?

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

我知道我可以在分开的表中存储分钟和每日,但这会限制我的灵活性,更不用说架构的清洁度了。

如果在Cassandra中这不容易/有效,那么在RIAK TS中这是可能的吗?

1 个答案:

答案 0 :(得分:1)

  

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

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

var parent = module.parent.exports
var parent = require('./');

此表的抽象可以看作:

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;
  

所以keyA将是我想要的系列,keyB将是白天,而keyC将是分钟

基本上,通过上面的表格,您可以回答查询:为我提供系列S(keyA)的所有值,分钟M(keyC)和X和Y之间的日期(keyB) 效率非常高,因为它会导致顺序扫描...

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

一种解决方案是按年拆分,例如拥有像Map<KeyA,SortedMap<KeyC,SortedMap<KeyB,val>>> 这样的复合分区键。这会对您的查询施加额外的限制:您必须每次都提供系列ID和年份