我有下表
mykey.mytable
id | user | item
------------------
0 | 'matt' | 'ball'
1 | 'bob' | 'bat'
2 | 'bill' | 'fridge'
3 | 'matt' | 'beer'
我想要的是用户数,例如
user | count
--------------
'matt' | 2
'bob' | 1
'bill' | 1
我如何在卡桑德拉这样做?
FWIW,我已经尝试了count(*),batch,counter和在另一个中使用一个select的结果。文档没有太大帮助,我的谷歌foo没有找到任何例子。我有点沮丧!
答案 0 :(得分:2)
不幸的是,Cassandra CQL没有聚合框架。因此,虽然您可以在具有GROUP BY
和COUNT
的关系数据库中轻松执行此操作,但Cassandra没有这样的机制。
非关系(NoSQL)数据建模的一个主要原则是构建表以匹配您的查询模式。如果查询用户项目的数量是您认为需要做的事情,那么您可以创建另一个表来保存该信息:
CREATE TABLE userItemCount (
user text,
itemCount counter,
PRIMARY KEY (user)
);
通过CQL你可以像这样增加那个计数器(假设Matt得到另一个项目):
UPDATE userItemCount SET itemCount=itemCount+1 WHERE user='matt';
当然,这样做的另一方面是,当条目存储在原始表中时,您需要构建一种机制来添加/增加适当的数据。
有关这个和其他Cassandra开发概念的视频演示,请查看Datastax Academy上的免费Java / Cassandra类:https://datastaxacademy.elogiclearning.com。会议#2,模块43涵盖了“计数器表”的使用。