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