我有一张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,最新版本。
谢谢!
Ĵ
答案 0 :(得分:2)
这在Cassandra(任何版本)中是不可能的,因为它需要先读后(反)模式。
如果符合您的需求,您可以尝试counter columns。您还可以尝试在应用程序级别进行缓存/计数。
您需要在应用程序级别发出读取,否则会导致群集性能下降。
答案 1 :(得分:2)
Cassandra在写入之前没有读取(除了使用Lightweight Transactions时),因此它不支持像您尝试做的那样依赖于列的现有值的操作。话虽如此,仍然可以使用Cassandra在您的应用程序代码中执行此操作。如果你有多个作者可能会更新这个值,你将需要使用前面提到的LWT来确保值是准确的,并且多个作者不会相互“踩”。基本上,您要遵循的步骤是:
SELECT
从Cassandra中读取当前值。如果您使用LWT,请确保您使用SERIAL
或LOCAL_SERIAL
的一致性级别进行阅读。UPDATE
语句更新Cassandra中的值。如果使用LWT,您需要执行UPDATE ... IF value = previous_value_you_read
。如果使用LWT,如果您在执行计算时读取的先前值已更改,则UPDATE
将被拒绝。 (并且您可以再次重试整个系列步骤。)请记住,LWT是昂贵的操作,特别是如果您正在阅读/更新的密钥严重争用。
希望有所帮助!