如何使用CQL更新Cassandra整数列?

tus*_*shR 7 cql cassandra

我在Cassandra有一张表'评论',如下所述:

CREATE TABLE reviews (
  review_id text,
  downcount int,
  upcount int,
  creation_date timestamp,
  PRIMARY KEY (review_id)
)
Run Code Online (Sandbox Code Playgroud)

可以说我想将upcount值增加1,我怎么能在Cassandra CQL中做到这一点?

当我做:

UPDATE reviews SET upcount = upcount +1 WHERE review_id = '123456';
Run Code Online (Sandbox Code Playgroud)

它给了我以下错误:

错误请求:upcount = upcount + 1非计数器列的操作()无效upcount.

cev*_*ris 21

您可以使用Cassandra的计数器列数据类型.请记住,如果非计数器列不是复合列的一部分,则不能将计数器列与非计数器列混合在同一列族中PRIMARY KEY.所以你必须将计数器分成另一个列族reviews_counts.

CREATE TABLE reviews (
  review_id text,
  creation_date timestamp,
  PRIMARY KEY (review_id)
)

CREATE TABLE reviews_counts (
  review_id text,
  downcount counter,
  upcount counter,
  PRIMARY KEY (review_id)
)
Run Code Online (Sandbox Code Playgroud)

现在增量语句应该有效.

UPDATE keyspace.reviews_counts 
SET upcount = upcount + 1
WHERE review_id = '123456'
Run Code Online (Sandbox Code Playgroud)

这里有一些关于Cassandra计数器列的文档. http://www.datastax.com/documentation/cql/3.0/cql/cql_using/use_counter_t.html

  • 好的答案,您可能想将SET计数器= upcount +1更改为SET upcount = upcount +1。 (2认同)

Ana*_*nth 5

你不能这样做.您必须阅读该列,更新应用程序端的值并分配更新的值.正如错误所示,只有计数器列支持cassandra中的此功能.

理由很简单.计数器跨分布式节点同步.由于cassandra确保最终的一致性,非计数器列上的更新可能会在服务器端创建竞争条件.