cassandra - 如何通过添加到现有值来更新十进制列

时间:2017-03-02 15:01:45

标签: cassandra cqlsh

我有一张cassandra表,如下所示:

create table position_snapshots_by_security(
 securityCode   text,
 portfolioId        int,   
 lastUpdated        date,
 units          decimal,
 primary key((securityCode), portfolioId)
)

我想这样的事情:

   update position_snapshots_by_security
   set units = units + 12.3,
               lastUpdated = '2017-03-02'
   where securityCode = 'SPY'
   and   portfolioId = '5dfxa2561db9'

但它不起作用。

是否有可能在Cassandra进行此类操作?我使用的是版本3.10,最新版本。

谢谢!

Ĵ

2 个答案:

答案 0 :(得分:2)

这在Cassandra(任何版本)中是不可能的,因为它需要先读后(反)模式。

如果符合您的需求,您可以尝试counter columns。您还可以尝试在应用程序级别进行缓存/计数。

您需要在应用程序级别发出读取,否则会导致群集性能下降。

答案 1 :(得分:2)

Cassandra在写入之前没有读取(除了使用Lightweight Transactions时),因此它不支持像您尝试做的那样依赖于列的现有值的操作。话虽如此,仍然可以使用Cassandra在您的应用程序代码中执行此操作。如果你有多个作者可能会更新这个值,你将需要使用前面提到的LWT来确保值是准确的,并且多个作者不会相互“踩”。基本上,您要遵循的步骤是:

  1. 使用SELECT从Cassandra中读取当前值。如果您使用LWT,请确保您使用SERIALLOCAL_SERIAL的一致性级别进行阅读。
  2. 执行计算以添加到应用程序代码中的当前值。
  3. 使用UPDATE语句更新Cassandra中的值。如果使用LWT,您需要执行UPDATE ... IF value = previous_value_you_read
  4. 如果使用LWT,如果您在执行计算时读取的先前值已​​更改,则UPDATE将被拒绝。 (并且您可以再次重试整个系列步骤。)请记住,LWT是昂贵的操作,特别是如果您正在阅读/更新的密钥严重争用。

    希望有所帮助!