Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cassandra/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Cassandra查询中的模运算_Cassandra_Modulo_Cql - Fatal编程技术网

Cassandra查询中的模运算

Cassandra查询中的模运算,cassandra,modulo,cql,Cassandra,Modulo,Cql,我想根据单元格的值更新cassandra表。我想在更新查询中使用模运算符。 不知怎的,是这样的: UPDATE mytable SET mycounter=(mycounter+90)%360 WHERE mykey="keyvalue"; 这怎么可能? 或者我需要获取值,应用模运算并写回它吗? 只要更新的字段有数据类型计数器,就可以添加一些内容,但我不知道如何在查询中应用模运算。哇,这是个好问题。我不确定这一点,所以我想我应该自己测试一下: Connected to Test Cluster

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

UPDATE mytable SET mycounter=(mycounter+90)%360 WHERE mykey="keyvalue";
这怎么可能? 或者我需要获取值,应用模运算并写回它吗?
只要更新的字段有数据类型计数器,就可以添加一些内容,但我不知道如何在查询中应用模运算。

哇,这是个好问题。我不确定这一点,所以我想我应该自己测试一下:

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)

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

或者……想出一些其他棘手的方法来更新它。是的,记住分布式环境和最终的一致性。对卡桑德拉来说,先读后写并不是一个万无一失的计划。