Cassandra更新max(a,b)函数

时间:2015-04-20 11:13:24

标签: cassandra apache-spark

如何在cassandra中提出此类型的请求?

UPDATE my_table SET my_column1 = MAX(my_column1, 100) and my_column2 = my_column2 + 10;

max()函数不存在。可以通过使用apache spark来做到这一点吗? 谢谢!

1 个答案:

答案 0 :(得分:2)

MAX是幂等的,在这种情况下看起来很简单,问题是C *是一个通用数据库,需要处理一些边缘情况。特别是删除和TTL问题,因为旧数据消失后仍然需要保持最大值。

你能做到这一点的几种方法是创建一个你在原子插入时更新的值,或者保持所有值按顺序插入,以便删除/ ttl旧的仍然存在的位置(在显而易见的位置)磁盘成本)。

 CREATE TABLE my_table_max (
     key text,
     max int static,
     deletableMax int,
     PRIMARY KEY (key, deletableMax) 
  ) WITH CLUSTERING ORDER BY (deletableMax DESC);

然后自动更新您的最大值,或者对于可删除的实现,插入新值:

  BEGIN BATCH
      INSERT INTO my_table_max (key, max) VALUES ('test', 1) IF NOT EXISTS;
      INSERT INTO my_table_max (key, deletableMax) VALUES ('test', 1);
  APPLY BATCH;

  BEGIN BATCH
      UPDATE my_table_max SET max = 5 WHERE key='test' IF max = 1;
      INSERT INTO my_table_max (key, deletableMax) VALUES ('test', 5);
  APPLY BATCH;

然后只查询top 1会给你最大值:

 select * from my_table_max limit 1;

 key  | deletableMax | max
------+--------------+-----
 test |            5 |   5

删除后会看到这两者之间的区别:

delete from my_table_max WHERE key = 'test' and deletablemax = 5;
cqlsh:test_ks> select * from my_table_max limit 1;

 key  | deletablemax | max
------+--------------+-----
 test |            1 |   5

因为它会按照保留旧值的顺序跟踪所有值;