【问题标题】:Practical workaround to update column value for entire Cassandra table更新整个 Cassandra 表的列值的实用解决方法
【发布时间】:2019-01-20 07:13:50
【问题描述】:

我知道由于 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 子句中用于更新。

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

【问题讨论】:

  • 有一些类似的讨论。在这个thread 中,需要设置一个空值。不幸的是,您描述的methods 似乎是解决方案...

标签: cassandra cassandra-3.0


【解决方案1】:

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

【讨论】:

  • 我认为 Cassandra 不允许使用默认值创建新列。这就是 Horia 建议将其设置为 null 的全部原因。无论如何,这对我不起作用,因为我只想将其中一个可能的值替换为新值。剩余的现有值应保持不变。
猜你喜欢
  • 2018-05-07
  • 1970-01-01
  • 2014-02-03
  • 1970-01-01
  • 1970-01-01
  • 2021-10-16
  • 2017-09-10
  • 1970-01-01
  • 2012-07-10
相关资源
最近更新 更多