2017-03-02 47 views
0

我有一個卡桑德拉表如下所示更新十進制列:卡桑德拉 - 如何通過添加到現有的價值

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

這不是卡桑德拉(任何版本)可能的,因爲它需要讀前寫(防)模式。

如果它們滿足您的需求,您可以嘗試counter columns。您也可以嘗試在應用程序級別進行緩存/計數。

您需要在應用程序級別發出讀取操作,否則會導致羣集性能下降。

2

Cassandra在寫入之前不會執行讀取操作(除非使用Lightweight Transactions),因此它不支持像您試圖執行的操作那樣依賴列的現有值執行的操作。有了這些說明,仍然可以在您的應用程序代碼中與Cassandra一起執行此操作。如果你有多個編寫者可能更新這個值,你會想要使用前面提到的LWT來確保這個值是準確的,並且多個編寫者不會相互「踩」。基本上,您要遵循的步驟如下:

  1. 使用SELECT從Cassandra中讀取當前值。如果您正在使用LWT,請確保您正在執行一致性級別爲SERIALLOCAL_SERIAL的讀取。
  2. 進行計算以添加到應用程序代碼中的當前值。
  3. UPDATE聲明更新Cassandra中的值。如果使用LWT,你會想要做UPDATE ... IF value = previous_value_you_read

如果使用LWT,如果您在進行計算時讀取的以前的值發生更改,則UPDATE將被拒絕。 (您可以再次重試整個系列步驟。)請記住,LWT是昂貴的操作,尤其是在您正在閱讀/更新的密鑰有很大爭用的情況下。

希望有幫助!