Cassandra查询中的模运算

时间:2014-10-06 17:21:53

标签: cassandra modulo cql

我想根据单元格的值更新cassandra表。我想在更新查询中使用模运算符。 不知怎的,这样:

UPDATE mytable SET mycounter=(mycounter+90)%360 WHERE mykey="keyvalue";

这怎么可能?
或者我需要获取值,应用模运算并将其写回?
只是添加一些东西似乎是可能的,因为更新的字段有数据类型计数器,但我不知道如何在查询中应用模运算。

1 个答案:

答案 0 :(得分:1)

哇,这是一个很好的问题。我不确定这个,所以我想我会自己测试一下:

Connected to Test Cluster at 192.168.1.69:9042.
[cqlsh 5.0.1 | Cassandra 2.1.0-rc5-SNAPSHOT | CQL spec 3.2.0 | Native protocol v3]
Use HELP for help.
aploetz@cqlsh> use stackoverflow ;

aploetz@cqlsh:stackoverflow> CREATE TABLE counterModTest (mykey text, mycounter counter, PRIMARY KEY(mykey));
aploetz@cqlsh:stackoverflow> UPDATE countermodtest SET mycounter=mycounter+1 WHERE mykey='keyvalue';
aploetz@cqlsh:stackoverflow> UPDATE countermodtest SET mycounter=mycounter+4 WHERE mykey='keyvalue';
aploetz@cqlsh:stackoverflow> SELECT * FROM countermodtest ;

 mykey    | mycounter
----------+-----------
 keyvalue |         5

(1 rows)

到目前为止,这么好。表创建,值初始化并递增4.现在对于棘手的部分:

aploetz@cqlsh:stackoverflow> UPDATE countermodtest SET mycounter=mycounter%4 WHERE mykey='keyvalue';
Invalid syntax at line 1, char 46
  UPDATE countermodtest SET mycounter=mycounter%4 WHERE mykey='keyvalue';
                                               ^
aploetz@cqlsh:stackoverflow> UPDATE countermodtest SET mycounter=mycounter*4 WHERE mykey='keyvalue';
<ErrorMessage code=2000 [Syntax error in CQL query] message="line 1:45 no viable alternative at input '*' (UPDATE countermodtest SET mycounter=[mycounter]*...)">
aploetz@cqlsh:stackoverflow> UPDATE countermodtest SET mycounter=mycounter/4 WHERE mykey='keyvalue';
Invalid syntax at line 1, char 46
  UPDATE countermodtest SET mycounter=mycounter/4 WHERE mykey='keyvalue';
                                               ^
aploetz@cqlsh:stackoverflow> UPDATE countermodtest SET mycounter=mycounter^2 WHERE mykey='keyvalue';
Invalid syntax at line 1, char 46
aploetz@cqlsh:stackoverflow> UPDATE countermodtest SET mycounter=mycounter-1 WHERE mykey='keyvalue';
aploetz@cqlsh:stackoverflow> SELECT * FROM countermodtest ;

 mykey    | mycounter
----------+-----------
 keyvalue |         4

(1 rows)

我用+, - ,*,/,^和%试了一下。它看起来像唯一有效的数学运算符是+和 - 。不错的想法,但是现在我认为你将不得不按键查询该行,用%(或任何操作符)客户端调整计数器,然后UPDATE它。由于您无法将计数器列设置为特定值,因此您必须将其存储为bigint或(如果它确实需要是计数器列)提出一些其他棘手的方法来更新它