如何在cassandra中提出此类型的请求?
UPDATE my_table SET my_column1 = MAX(my_column1, 100) and my_column2 = my_column2 + 10;
max()函数不存在。可以通过使用apache spark来做到这一点吗? 谢谢!
答案 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
因为它会按照保留旧值的顺序跟踪所有值;