关于Cassandra复合柱的文献
当我试图查找有关复合列的信息时,我找不到比2013年更新的任何内容(特别是Google的top link,它在谈到使用复合列时没有CQL代码,显然使用了非常旧的Java驱动程序)。新版本的Cassandra中是否仍然存在复合列?我的意思是,除了有一个复合键 我是Cassandra的新手,实际上我想知道它们是否适合我的用例,如下所述。考虑一个具有4个双值列的表,如“代码> w <代码>,<代码> x,<代码> y,<代码> z < /代码>。这些数据来自三个来源,即关于Cassandra复合柱的文献,cassandra,datastax,cql,Cassandra,Datastax,Cql,当我试图查找有关复合列的信息时,我找不到比2013年更新的任何内容(特别是Google的top link,它在谈到使用复合列时没有CQL代码,显然使用了非常旧的Java驱动程序)。新版本的Cassandra中是否仍然存在复合列?我的意思是,除了有一个复合键 我是Cassandra的新手,实际上我想知道它们是否适合我的用例,如下所述。考虑一个具有4个双值列的表,如“代码> w , x, y, z < /代码>。这些数据来自三个来源,即a、b和c。每个源可能缺少部分数据,因此表的每行最多有12个数字
a
、b
和c
。每个源可能缺少部分数据,因此表的每行最多有12个数字。
我不想创建3个包含4列的表来存储来自不同来源的值,然后合并这些表来填充缺少的字段,而是想创建一个表,将4个数据列建模为4个超级列
或复合列
。类似于a:w
,b:w
,c:w
,a:x
,b:x
,a:y
,b:y
,c:y
,a:z
,b:z
,。此外,每行都有一个时间戳作为主键
我想知道的是,我是否可以像MyTable中的SELECT*:w AS w那样进行查询
,这样,对于每一行,x
的一个值都会从任何可用的源返回(无论从哪个源返回)。虽然我还希望保留从特定源检索数据的功能,例如从MyTable中选择a:w
----------------------------------------------------------------
| key | a:w | b:w | c:w | a:x | b:x | c:x | a:y | b:y | c:y | ...
----------------------------------------------------------------
| 1 | 10 | 10 | - | ....
| 2 | - | 1 | 2 | ....
| 3 | 11 | - | - | ....
| 4 | 12 | 11 | 11 | ....
-----------------------------------------------------------------
SELECT *:w AS w FROM MyTable
(10, 1, 11, 12) // would be an acceptable answer
SELECT a:w AS w FROM MyTable
(10, 11, 12) // would be an acceptable answer
复合列是与节俭协议相关的词汇表。在内部,在Cassandra 2.2之前,存储引擎仍然处理复合列,并将它们转换为集群列,这是CQL附带的新词汇表
自从Cassandra 3.x以来,存储引擎已经被重写,因此我们不再使用复合列存储数据。我们将存储引擎与新的CQL语义(例如,分区键/集群列)对齐。为了向后兼容,在处理遗留的Thrift协议时,我们仍然将集群列转换回复合列语义
如果您只是从Cassandra开始,请忘记旧的Thrift协议,立即使用CQL语义
根据您的需要,应使用以下模式:
CREATE TABLE my_data(
data text,
source text,
PRIMARY KEY ((data), source)
);
INSERT INTO my_data(data, source) VALUES('data1','src1');
INSERT INTO my_data(data, source) VALUES('data1','src2');
...
INSERT INTO my_data(data, source) VALUES('dataN','src1');
...
INSERT INTO my_data(data, source) VALUES('dataN','srcN');
//Select all sources for data1
SELECT source FROM my_data WHERE data='data1';
//Select data and source
SELECT * FROM my_data WHERE data='data1' AND source='src1';
谢谢你的澄清,这澄清了我的困惑(因此我接受这个答案)。不过,我看不出您建议的模式如何与我的问题相匹配。我更新了一点用例的解释。如果还不完全清楚,我将添加一个具体示例。我现在正在考虑使用映射,以便列w
,x
,y
,z
将具有类型map
。我想,如果在地图的键上有一个索引,我应该能够轻松地查询特定的来源。