【问题标题】:Documentation on Cassandra Composite Columns关于 Cassandra 复合列的文档
【发布时间】:2016-09-28 12:57:24
【问题描述】:

当我尝试查找关于复合列的信息时,我找不到任何比 2013 年更新的内容(特别是 this one 是 Google 的顶级链接,在谈论使用复合列时没有 CQL 代码,并且显然使用了非常旧的 Java司机)。复合列是否仍然存在于较新版本的 Cassandra 中?我的意思是,除了有一个复合键。

我是 Cassandra 的新手,实际上想了解它们是否适合我的用例,如下所述。考虑一个具有 4 个双值列的表,例如 wxyz。这些数据是从 3 个来源收集的,例如 abc。每个来源都可能缺少部分数据,因此表格的每一行最多有 12 个数字。 我不是创建 3 个具有 4 列的表来存储来自不同来源的值,然后合并这些表以填充缺失的字段,而是考虑使用一个表将 4 个数据列建模为 4 super columnscomposite columns .像a:wb:wc:wa:xb:xc:xa:yb:y,@9876543@39@,b:zb:z,@9876543441@,@987654341。此外,每一行都有一个时间戳作为主键。

我想知道的是我是否可以有一个像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

【问题讨论】:

    标签: cassandra datastax cql


    【解决方案1】:

    复合列是与 Thrift 协议相关的词汇。在内部,在 Cassandra 2.2 之前,存储引擎仍然处理复合列,并将它们翻译clustering column,这是 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';
    

    【讨论】:

    • 感谢您的澄清,这消除了我的困惑(因此我接受了这个答案)。不过,我看不出您建议的架构如何与我的问题相匹配。我稍微更新了我的用例的解释。我会添加一个具体的例子,以防它仍然不完全清楚。
    • 我现在正在考虑使用映射,这样列 wxyz 将具有 map<text, double> 类型。我想通过地图键上的索引,我应该能够轻松查询特定来源。
    猜你喜欢
    • 2014-01-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-26
    • 2013-07-09
    • 2012-07-12
    • 2019-08-29
    相关资源
    最近更新 更多