关于 Cassandra 复合列的文档
Documentation on Cassandra Composite Columns
当我尝试查找有关复合列的信息时,我找不到比 2013 年更新的任何内容(具体来说 this one 是 Google 的顶部 link,当谈论使用复合列,显然使用了一个非常旧的 Java 驱动程序)。复合列是否仍然存在于较新版本的 Cassandra 中?我的意思是,除了有一个复合键。
我是 Cassandra 的新手,实际上想了解它们是否适合我的用例table,如下所述。考虑具有 4 个双值列的 table,比如 w
、x
、y
、z
。这些数据是从 3 个来源收集的,例如 a
、b
和 c
。每个来源可能会丢失部分数据,因此 table 每行最多有 12 个数字。
与其创建 3 个具有 4 列的 tables 来存储来自不同来源的值,然后合并 tables 以填充缺失的字段,我正在考虑有一个 table将 4 个数据列建模为 4 super columns
或 composite columns
。像 a:w
、b:w
、c:w
、a:x
、b:x
、c:x
、a:y
、b:y
之类的东西c:y
、a:z
、b:z
、c:z
。此外,每一行都有一个时间戳作为主键。
我想知道的是我是否可以有一个像 SELECT *:w AS w FROM MyTable
这样的查询,这样对于每一行, x
的一个值从任何可用的来源返回(不无论来自哪个来源)。尽管我还想保留从特定来源检索数据的能力,例如 SELECT a:w FROM MyTable
.
----------------------------------------------------------------
| 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
Composite栏目是与Thrift协议相关的词汇。在内部,在 Cassandra 2.2 之前,存储引擎仍然处理复合列并将它们 翻译 为 聚类列 ,[=19= 附带的新词汇表]CQL.
自从 Cassandra 3.x 以来,存储引擎已被重写,因此我们不再使用复合列存储数据。我们将存储引擎与新的 CQL 语义对齐,例如分区 key/clustering 列。为了向后兼容,在处理遗留 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';
当我尝试查找有关复合列的信息时,我找不到比 2013 年更新的任何内容(具体来说 this one 是 Google 的顶部 link,当谈论使用复合列,显然使用了一个非常旧的 Java 驱动程序)。复合列是否仍然存在于较新版本的 Cassandra 中?我的意思是,除了有一个复合键。
我是 Cassandra 的新手,实际上想了解它们是否适合我的用例table,如下所述。考虑具有 4 个双值列的 table,比如 w
、x
、y
、z
。这些数据是从 3 个来源收集的,例如 a
、b
和 c
。每个来源可能会丢失部分数据,因此 table 每行最多有 12 个数字。
与其创建 3 个具有 4 列的 tables 来存储来自不同来源的值,然后合并 tables 以填充缺失的字段,我正在考虑有一个 table将 4 个数据列建模为 4 super columns
或 composite columns
。像 a:w
、b:w
、c:w
、a:x
、b:x
、c:x
、a:y
、b:y
之类的东西c:y
、a:z
、b:z
、c:z
。此外,每一行都有一个时间戳作为主键。
我想知道的是我是否可以有一个像 SELECT *:w AS w FROM MyTable
这样的查询,这样对于每一行, x
的一个值从任何可用的来源返回(不无论来自哪个来源)。尽管我还想保留从特定来源检索数据的能力,例如 SELECT a:w FROM MyTable
.
----------------------------------------------------------------
| 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
Composite栏目是与Thrift协议相关的词汇。在内部,在 Cassandra 2.2 之前,存储引擎仍然处理复合列并将它们 翻译 为 聚类列 ,[=19= 附带的新词汇表]CQL.
自从 Cassandra 3.x 以来,存储引擎已被重写,因此我们不再使用复合列存储数据。我们将存储引擎与新的 CQL 语义对齐,例如分区 key/clustering 列。为了向后兼容,在处理遗留 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';