代码之家  ›  专栏  ›  技术社区  ›  redwulf

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

  •  0
  • redwulf  · 技术社区  · 8 年前

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

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

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

    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 回复  |  直到 8 年前
        1
  •  -2
  •   pavel    8 年前

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

    推荐文章