cassandra - 为什么 cassandra "select"可以在二级 key 上,但不能使用二级 key 更新? (1.2.8+)

标签 cassandra cql

假设这个表:

create table s4 (a timeuuid primary key, b timeuuid, stuff text);
create index s4_index1 on s4 (b);

这有效:
select * from s4 where b = 259300f1-01bb-11e3-89a8-896ab45a266f;

但这失败了。为什么?我该如何解决它?
update s4 set stuff='f' where b=259300f1-01bb-11e3-89a8-896ab45a266f;
error->> Bad Request: Non PRIMARY KEY b found in where clause

最佳答案

在不指定主键的情况下进行更新意味着 Cassandra 必须首先进行分布式搜索以获取所有记录。然后在内部发布所有这些记录的更新。虽然可以实现,但它与 Cassandra 内部的当前写入路径有很大不同。

当前写入路径查看插入/更新,根据 key 确定应该将其发送到哪些节点,然后将请求发送到要写入磁盘的那些节点。
update X where Y的写路径,其中 Y 是二级索引,会大不相同。它需要向每个节点发送更新请求,并等待搜索/更新过程完成。这将比正常写入需要更长的时间,而 Cassandra 擅长快速写入。

话虽如此,Cassandra 项目始终对新功能的贡献和讨论持开放态度。 http://wiki.apache.org/cassandra/HowToContribute

对于“我如何解决它”。唯一的方法是自己执行select 语句,然后自己更新所有行。或者重新设计您的数据模型,以便您想要进行的更新基于主键。

关于cassandra - 为什么 cassandra "select"可以在二级 key 上,但不能使用二级 key 更新? (1.2.8+),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18162070/

相关文章:

cassandra - Cassandra 操作的时间复杂度(Big O)是多少?

Cassandra:插入较旧的时间戳

r - 通过sparklyr将cassandra表导入spark - 可以仅选择某些列吗?

c# - NDepend 代码质量指标 - 自定义 CQL - 棕地开发

c# - 我可以强制 POCO 中的字段只在类型初始化程序中设置吗?

ndepend - ndepend 和 cppdepend 中的 CQL 可查看各个修订版本中指标的变化

Cassandra 1.2 迁移 : Broken pipe

python - 运行 sync_table 时引发 CQLEngineException ("Models must be derived from base Model.")

java - cassandra 中是否有任何机制可以在通过 INSERT 或 UPDATE 查询更改表时发送通知?

php - Cassandra CQL : Unable to insert