关于Cassandra复合柱的文献

关于Cassandra复合柱的文献,cassandra,datastax,cql,Cassandra,Datastax,Cql,当我试图查找有关复合列的信息时,我找不到比2013年更新的任何内容(特别是Google的top link,它在谈到使用复合列时没有CQL代码,显然使用了非常旧的Java驱动程序)。新版本的Cassandra中是否仍然存在复合列?我的意思是,除了有一个复合键 我是Cassandra的新手,实际上我想知道它们是否适合我的用例,如下所述。考虑一个具有4个双值列的表,如“代码> w , x, y, z < /代码>。这些数据来自三个来源,即a、b和c。每个源可能缺少部分数据,因此表的每行最多有12个数字

当我试图查找有关复合列的信息时,我找不到比2013年更新的任何内容(特别是Google的top link,它在谈到使用复合列时没有CQL代码,显然使用了非常旧的Java驱动程序)。新版本的Cassandra中是否仍然存在复合列?我的意思是,除了有一个复合键

我是Cassandra的新手,实际上我想知道它们是否适合我的用例,如下所述。考虑一个具有4个双值列的表,如“代码> w <代码>,<代码> x,<代码> y,<代码> z < /代码>。这些数据来自三个来源,即
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
。我想,如果在地图的键上有一个索引,我应该能够轻松地查询特定的来源。