cassandra - how to update decimal column by adding to existing value

大憨熊 提交于 2019-12-12 01:36:42

问题


I have a cassandra table that looks like the following:

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

And I would like to something like this:

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

But it doesn't work.

Is it possible to do this kind of operation in Cassandra? I am using version 3.10, the latest one.

Thank you!

J


回答1:


This is not possible in Cassandra (any version) because it would require a read-before-write (anti-)pattern.

You can try the counter columns if they suit your needs. You could also try to caching/counting at application level.

You need to issue a read at application level otherwise, killing your cluster performance.




回答2:


Cassandra doesn't do a read before a write (except when using Lightweight Transactions) so it doesn't support operations like the one you're trying to do which rely on the existing value of a column. With that said, it's still possible to do this in your application code with Cassandra. If you'll have multiple writers possibly updating this value, you'll want to use the aforementioned LWT to make sure the value is accurate and multiple writers don't "step on" each other. Basically, the steps you'll want to follow to do that are:

  1. Read the current value from Cassandra using a SELECT. Make sure you're doing the read with a consistency level of SERIAL or LOCAL_SERIAL if you're using LWTs.
  2. Do the calculation to add to the current value in your application code.
  3. Update the value in Cassandra with an UPDATE statement. If using a LWT you'll want to do UPDATE ... IF value = previous_value_you_read.

If using LWTs, the UPDATE will be rejected if the previous value that you read changed while you were doing the calculation. (And you can retry the whole series of steps again.) Keep in mind that LWTs are expensive operations, particularly if the keys you are reading/updating are heavily contended.

Hope that helps!



来源:https://stackoverflow.com/questions/42558843/cassandra-how-to-update-decimal-column-by-adding-to-existing-value

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!