我知道由于Cassandra的分布式特性,它没有提供更新整个表的列值的方法。
但是,我确实有一个需要执行此操作的要求。我需要将“枚举”列值更新为新值。该“枚举”的所有其余值应保持不变。此列不是我的主键的一部分。
我可以想到两种方法来实现这一目标,但两者似乎都有些令人费解,并且存在我宁愿不必处理的问题:
a)用Java,scala,node或任何具有Cassandra驱动程序的语言编写代码。
但是,我需要编写一些代码以仅使用一次然后扔掉,而且很可能会遇到我的公司在将其在其他环境(主要是生产环境)中运行时遇到的麻烦。
b)编写在两个单独的步骤中执行的cql脚本。
此解决方案容易出错,具体取决于重新创建表的方式。除非我使用describe <table>
的结果,否则可能会导致创建索引遗漏,或者不应用最初创建表时不存在的某些更改。在删除和重新创建表的同时,还需要停机时间,以及复制数据直到获得所需的一致性为止的时间。
还有其他选择吗?任何使用包含此字段的物化视图的方法都需要更新,并以某种方式用于更新?
我可以使用token()函数进行更新吗?我尝试过,但收到一条消息,说它不能在where子句中用于更新。
还有其他简单干净的方法来进行这些更新吗?
答案 0 :(得分:-1)
最大的问题是更新应该是原子的。该列的数据也发生了很大变化。 作为一种选择,您可以创建一个新列,并用更新后的值填充它。 同时,在受影响的分区上限制I / O操作。操作完成后,启用操作。 您需要同时跟踪已处理的分区。