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

更新整个Cassandra表的列值的实用解决方法,cassandra,cassandra-3.0,Cassandra,Cassandra 3.0,我知道,由于Cassandra的分布式特性,它无法为整个表更新列值 然而,我有一个要求,我需要这样做。我需要将“enum”列值更新为新值。该“枚举”的所有剩余值应保持不变。此列不是我的主键的一部分 我可以想出两种方法来实现这一目标,但这两种方法似乎都有点复杂,而且都有一些我不想处理的问题: a) 使用java、scala、node或任何语言编写代码,并使用cassandra的驱动程序 从cassandra表中读取流(其中将包括我的主键) 更新要在对象中更新的值 根据主键分别保存每一行 然而,我需

我知道,由于Cassandra的分布式特性,它无法为整个表更新列值

然而,我有一个要求,我需要这样做。我需要将“enum”列值更新为新值。该“枚举”的所有剩余值应保持不变。此列不是我的主键的一部分

我可以想出两种方法来实现这一目标,但这两种方法似乎都有点复杂,而且都有一些我不想处理的问题:

a) 使用java、scala、node或任何语言编写代码,并使用cassandra的驱动程序

  • 从cassandra表中读取流(其中将包括我的主键)
  • 更新要在对象中更新的值
  • 根据主键分别保存每一行
  • 然而,我需要编写一些代码,只使用一次,然后扔掉,我很可能会遇到问题,需要得到公司的批准,才能在其他环境(主要是生产环境)中运行

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

  • 第一个cql脚本将表转储到csv文件
  • bash脚本将替换我想要在csv文件中更改的值(使用sed或其他方法)
  • 第二个cql脚本将删除我的表和物化视图,从头开始重新创建它们,然后将更新的csv复制回表,并重新创建我的所有物化视图
  • 此解决方案容易出错,具体取决于重新创建表的方式。除非我使用
    descripe
    的结果,否则可能会导致忽略索引的创建,或者不应用最初创建表时未出现的某些更改。它还需要停机时间,同时删除和重新创建表,再加上复制数据的时间,直到达到所需的一致性

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

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


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

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

    也有类似的讨论。在这种情况下,有必要设置一个空值。不幸的是,您描述的方法似乎是解决方案……我认为Cassandra不允许使用默认值创建新列。这就是Horia建议将其设置为null的全部原因。无论如何,这对我不起作用,因为我只想用一个可能的值替换一个新值。其余的现有值应保持不变。