我有一个Cassandra“表”,如下所示:
CREATE TABLE example
(
result_id INT,
evaluator_id INT,
score DOUBLE,
PRIMARY KEY(result_id, evaluator_id));
);
以及如下查询:
SELECT result_id, evaluator_id, score FROM example;
我了解查询单个分区键时,结果将按定义的顺序按聚类键排序。但是,为了支持我的数据模型,我假设在上一个不受限制的查询中,结果将通过partition_key“ result_id”分组在一起,即
for row in queryResults:
resultId = row['result_id']
if resultId == lastResultId:
# append the score and evaluator id to a data structure
else:
# do something with the data structure, assuming we've now
# received all scores for the given result_id
lastResultId = resultId
这是一个有效的假设吗?考虑到存储细节,这是有道理的,并且可以在原型中使用,但是似乎在任何地方都没有明确保证。例如,如果我要从多个节点提取数据,是否可以将具有不同结果ID的行进行混合?
最佳答案
这是一个有效的假设吗?
是的,结果将始终按分区键分组。这是因为特定分区的所有CQL行都一起存储在磁盘上。具有相同分区键的CQL行将散列为相同的令牌值,并将全部(一起)存储在负责该特定令牌范围的节点上。