【问题标题】:Saving data in matrix format in Cassandra?在 Cassandra 中以矩阵格式保存数据?
【发布时间】:2017-07-12 09:50:30
【问题描述】:

我正在使用 Cassandra 并希望以矩阵格式存储数据。目前,我正在使用列表存储值。 例如:我创建了一个表格“矩阵”

CREATE TABLE matrix (row_id int PRIMARY KEY, row_values list<int>);

我在表格中输入了一些值。 (注意:行数和列数可以变化)

INSERT INTO matrix (row_id, row_values) values (1, [1,2,3,4,5,6,.......]);

现在我想检索 row_values 的第二个元素,但我的方法无法检索列表的第二个元素,但是我可以使用以下查询更新和删除该元素:

UPDATE matrix SET row_values[1] = 50 where row_id =1;

现在我的问题是,是否可以从列表中检索特定元素。如果没有,那么是否有任何其他方法可以用来以矩阵形式存储数据并从矩阵中检索任何元素?

【问题讨论】:

    标签: cassandra cassandra-2.0 database nosql


    【解决方案1】:

    使用clustering column 代替List 并明确指定列索引为column_id

    CREATE TABLE matrix (
    row_id int,
    column_id int,
    value int,
    PRIMARY KEY ( (row_id ), column_id ))
    

    现在你可以执行插入了:

    INSERT INTO matrix (row_id, column_id, value) VALUES (0, 0, 0);
    

    或者使用批处理语句插入多个值:

    BEGIN BATCH 
    INSERT INTO matrix (row_id, column_id, value ) VALUES (1, 0, 0);
    INSERT INTO matrix (row_id, column_id, value ) VALUES (1, 1, 1);
    INSERT INTO matrix (row_id, column_id, value ) VALUES (1, 2, 2);
    ...
    APPLY BATCH;
    

    这批语句中的所有语句都在一个分区内执行写入,它会有很好的性能。

    通过row_idcolumn_id 检索值:

    SELECT * FROM matrix WHERE row_id = 1 and column_id=1;
    

    或通过row_id检索所有列:

    SELECT * FROM matrix WHERE row_id = 1;
    

    但是这个解决方案有一个不好的方面:你应该在应用程序端维护column_id 的序列。

    【讨论】:

    • 能否请您详细说明一下,为什么它有很好的性能?我将不得不经常执行这些操作,您是否认为网络开销太大?
    • 如果批处理中的所有语句都写入一个分区内,协调节点将只与该分区的特定节点通信。请参阅有关批次的文档:docs.datastax.com/en/cql/3.3/cql/cql_using/…
    【解决方案2】:

    不是答案

    似乎没有任何方法可以在 cassandra 中仅选择列表的一个索引值

    如果你存储索引,甚至不在地图中。

    所以 TABLE 是..

        CREATE TABLE matrix (row_id int PRIMARY KEY, row_values map<int, int>);
    

    插入将是..

        INSERT INTO matrix (row_id, row_values) values (1, {0:1,1:2,2:3,3:4,4:5,5:6,.......});
    

    更新将是..

        UPDATE matrix SET row_values[1] = 50 WHERE row_id = 1;
    

        UPDATE matrix SET row_values = row_values + {1:50} WHERE row_id = 1;
    

    删除单个地图元素将是..

        DELETE row_values[1] FROM matrix WHERE row_id = 1;
    

    但是你不能选择单个索引值..

    您必须将索引存储为一列。这看起来并不干净,但我们可以在这里做的很少。

    很久以前就有人问过这件事,但我知道什么都没做。

    但是如果你将在一些 JAVA 程序中查询这个,那么你可以通过使用来获取

        com.datastax.driver.core.Row.getMap()
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-05-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多