Cassandra:我可以在第三个维度上进行索引和查询吗?
Cassandra: can I index and query along a third dimension?
我想在 Cassandra 中的查询中加入第三维标准。它已经允许高效的二维查询,因为它不仅仅是一个键值存储,而且实际上是一个键值存储。即:
简单的键值存储:
键-键-值存储:
所以 Cassandra 的吸引力在于给定 keyA 的值,我可以沿着 keyB 执行非常有效的范围查询,因为它们是连续存储的。
现在是否有可能,给定 keyA 和 keyB,也有一个沿第三维的索引,比如 keyC,这样我就可以根据 keyC 限制 returned 的值?
所以基本上:
基本上给定 keyA,比如 keyA-1,和一系列 KeyB,比如 keyB-2 到 keyB-4,我只想要 return 与 keyC-3 对应的值,如上图绿色所示。
我知道这是可能的,因为即使是简单的键值存储也可以使用多个索引来完成。问题是,它高效吗?我还能沿着 keyB 执行非常快速的范围查询吗?
我的用例是时间序列,我想在其中存储同一系列的分钟分辨率和每日分辨率数据。所以 keyA 是我想要的系列,keyB 是日期,keyC 是分钟。我想这样做是因为将所有内容存储为分钟意味着如果我需要每日数据,这将意味着从网络中获取太多数据(每天 24*60 分钟,我只想要其中之一),进入内存,以及大量的客户端聚合。
我知道我可以将分钟和每日存储在单独的表中,但这会在一定程度上限制我的灵活性,更不用说架构的清洁度了。
如果这不是 easy/efficient 在 Cassandra 中,这在 RIAK TS 中可能吗?
Basically given keyA, say keyA-1, and a range of KeyB, say keyB-2 thru keyB-4, I want only to return the values corresponding with keyC-3, shown green above.
是的,可以使用以下 table 结构
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;
这个table的抽象可以看作:
Map<KeyA,SortedMap<KeyC,SortedMap<KeyB,val>>>
So keyA would be the series I want, keyB would be the day, and keyC would be the minute
基本上,通过上面的 table,您可以回答查询:给我一个系列 S (keyA)、分钟 M (keyC) 和X 和 Y 之间的天(keyB) 非常非常有效,因为它会导致顺序扫描...
现在唯一的问题是分区键,它只基于系列ID(keyA)会任意增长非常大。
一种解决方案是按年份拆分,例如有一个像 PRIMARY KEY((keyA, year), keyC, keyB)
这样的复合分区键。这会对您的查询施加额外的限制:您必须每次都提供意甲 ID 和年份
我想在 Cassandra 中的查询中加入第三维标准。它已经允许高效的二维查询,因为它不仅仅是一个键值存储,而且实际上是一个键值存储。即:
简单的键值存储:
键-键-值存储:
所以 Cassandra 的吸引力在于给定 keyA 的值,我可以沿着 keyB 执行非常有效的范围查询,因为它们是连续存储的。
现在是否有可能,给定 keyA 和 keyB,也有一个沿第三维的索引,比如 keyC,这样我就可以根据 keyC 限制 returned 的值?
所以基本上:
基本上给定 keyA,比如 keyA-1,和一系列 KeyB,比如 keyB-2 到 keyB-4,我只想要 return 与 keyC-3 对应的值,如上图绿色所示。
我知道这是可能的,因为即使是简单的键值存储也可以使用多个索引来完成。问题是,它高效吗?我还能沿着 keyB 执行非常快速的范围查询吗?
我的用例是时间序列,我想在其中存储同一系列的分钟分辨率和每日分辨率数据。所以 keyA 是我想要的系列,keyB 是日期,keyC 是分钟。我想这样做是因为将所有内容存储为分钟意味着如果我需要每日数据,这将意味着从网络中获取太多数据(每天 24*60 分钟,我只想要其中之一),进入内存,以及大量的客户端聚合。
我知道我可以将分钟和每日存储在单独的表中,但这会在一定程度上限制我的灵活性,更不用说架构的清洁度了。
如果这不是 easy/efficient 在 Cassandra 中,这在 RIAK TS 中可能吗?
Basically given keyA, say keyA-1, and a range of KeyB, say keyB-2 thru keyB-4, I want only to return the values corresponding with keyC-3, shown green above.
是的,可以使用以下 table 结构
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;
这个table的抽象可以看作:
Map<KeyA,SortedMap<KeyC,SortedMap<KeyB,val>>>
So keyA would be the series I want, keyB would be the day, and keyC would be the minute
基本上,通过上面的 table,您可以回答查询:给我一个系列 S (keyA)、分钟 M (keyC) 和X 和 Y 之间的天(keyB) 非常非常有效,因为它会导致顺序扫描...
现在唯一的问题是分区键,它只基于系列ID(keyA)会任意增长非常大。
一种解决方案是按年份拆分,例如有一个像 PRIMARY KEY((keyA, year), keyC, keyB)
这样的复合分区键。这会对您的查询施加额外的限制:您必须每次都提供意甲 ID 和年份