我正在与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;
现在我的问题是,是否可以从列表中检索特定元素。如果没有,那么有没有其他方法可以用来以矩阵形式存储数据并从矩阵中检索任何元素?
答案 0 :(得分:3)
使用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_id
和column_id
检索价值:
SELECT * FROM matrix WHERE row_id = 1 and column_id=1;
或按row_id
检索所有列:
SELECT * FROM matrix WHERE row_id = 1;
但是这个解决方案有一个不好的方面:你应该在应用程序端维护column_id
的序列。
答案 1 :(得分:1)
不是答案
似乎没有办法在cassandra中只选择list的一个索引值
如果存储索引,甚至不在地图中。
所以TABLE会是..
CREATE TABLE matrix (row_id int PRIMARY KEY, row_values map<int, int>);
INSERT将是..
INSERT INTO matrix (row_id, row_values) values (1, {0:1,1:2,2:3,3:4,4:5,5:6,.......});
UPDATE将是..
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()