更新整个Cassandra表的列值的实用解决方法

时间:2018-08-13 14:08:35

标签: cassandra cassandra-3.0

我知道由于Cassandra的分布式特性,它没有提供更新整个表的列值的方法。

但是,我确实有一个需要执行此操作的要求。我需要将“枚举”列值更新为新值。该“枚举”的所有其余值应保持不变。此列不是我的主键的一部分。

我可以想到两种方法来实现这一目标,但两者似乎都有些令人费解,并且存在我宁愿不必处理的问题:

a)用Java,scala,node或任何具有Cassandra驱动程序的语言编写代码。

  1. 从该cassandra表中读取流(其中将包含我的主键)
  2. 更新我要在对象中更新的值。
  3. 根据主键分别保存每一行。

但是,我需要编写一些代码以仅使用一次然后扔掉,而且很可能会遇到我的公司在将其在其他环境(主要是生产环境)中运行时遇到的麻烦。

b)编写在两个单独的步骤中执行的cql脚本。

  1. 第一个cql脚本将表转储到csv文件中。
  2. bash脚本将替换我要在csv文件中更改的值(使用sed或其他内容)。
  3. 第二个cql脚本将删除我的表和实例化视图,从头开始创建它们,然后将更新的csv复制回到表中,并重新创建我的所有实例化视图。

此解决方案容易出错,具体取决于重新创建表的方式。除非我使用describe <table>的结果,否则可能会导致创建索引遗漏,或者不应用最初创建表时不存在的某些更改。在删除和重新创建表的同时,还需要停机时间,以及复制数据直到获得所需的一致性为止的时间。

还有其他选择吗?任何使用包含此字段的物化视图的方法都需要更新,并以某种方式用于更新?

我可以使用token()函数进行更新吗?我尝试过,但收到一条消息,说它不能在where子句中用于更新。

还有其他简单干净的方法来进行这些更新吗?

1 个答案:

答案 0 :(得分:-1)

最大的问题是更新应该是原子的。该列的数据也发生了很大变化。 作为一种选择,您可以创建一个新列,并用更新后的值填充它。 同时,在受影响的分区上限制I / O操作。操作完成后,启用操作。 您需要同时跟踪已处理的分区。