【发布时间】:2019-01-20 07:13:50
【问题描述】:
我知道由于 Cassandra 的分布式特性,它不提供更新整个表的列值的方法。
但是,我确实有需要这样做的地方。我需要将“枚举”列值更新为新值。该“枚举”的所有剩余值应保持不变。此列不是我的主键的一部分。
我可以想到两种替代方案来实现这一目标,但两者似乎都有点令人费解,并且都有我不想处理的问题:
a) 用 java、scala、node 或任何带有 cassandra 驱动程序的语言编写代码。
- 从该 cassandra 表中读取一个流(其中将包括我的主键)
- 在我的对象中更新我想要更新的值。
- 根据主键单独保存每一行。
但是,我需要编写一些代码,只使用一次然后就扔掉,而且我很可能会遇到公司批准在其他环境(主要是生产环境)中运行它的问题。
b) 编写分两步执行的 cql 脚本。
- 第一个 cql 脚本将表转储到 csv 文件中。
- bash 脚本将替换我想要在 csv 文件中更改的值(使用 sed 或其他工具)。
- 第二个 cql 脚本将删除我的表和实体化视图,从头开始重新创建它们,然后将更新的 csv 复制回表,并重新创建我的所有实体化视图。
此解决方案容易出错,具体取决于重新创建表的方式。除非我使用describe <table> 的结果,否则可能会导致忽略创建索引,或者不应用最初创建表时不存在的一些更改。它还需要停机时间,同时删除和重新创建表,以及复制数据直到获得所需一致性的时间。
还有其他选择吗?有什么方法可以使用包含此字段的物化视图,我需要更新并以某种方式将其用于更新?
我可以使用 token() 函数进行更新吗?我试过了,但收到一条消息说它不能在 where 子句中用于更新。
还有其他简单干净的方法来进行这些更新吗?
【问题讨论】: