我有下表。是否可以通过单个CQL选择为每个用户计算关注者数量?
create table user_follows ( name text, follows_name text, primary key (name,follows_name) );
name | follows_name
---------+--------------
indrani | aravind
indrani | jorge
indrani | lalitha
indrani | vijay
vijay | aravind
vijay | david
vijay | mark
filmon | david
filmon | jorge
filmon | kishore
filmon | lalitha
filmon | mark
filmon | vijay
david | aravind
david | mark
我有以下查询返回单个用户的计数
select count(follows_name) from user_follows where name='indrani';
答案 0 :(得分:1)
我担心这不受支持。您唯一能做的就是为每个分区发出COUNT(*)
查询。
如果您不知道您的分区,可以使用PER PARTITION LIMIT 1
检索每个分区的第一条记录(以及分区密钥)(分区内的数据按群集密钥排序):
SELECT name FROM user_follows PER PARTITION LIMIT 1;
这需要Cassandra 3.6及更高版本。
然而,考虑更多关于它的问题,单个COUNT
查询(通过分区限制WHERE
)将产生对分区的扫描,因为这就是C *如何计算记录。如果您为所有分区发出此查询,那么您将扫描所有数据集,并可能会终止您的群集。
如果您不需要精确,您可以使用相同的分区键创建计数器表,并为每个用户递增/递减计数器:
CREATE TABLE user_follows_counts (
name text PRIMARY KEY,
followers counter,
);
现在,您可以在不扫描数据集的情况下获得所需内容,并且查询效率更高:
SELECT * FROM user_follows_counts;
查看counters上的文档以获取更多信息。
答案 1 :(得分:0)
只有在cassandra中使用自定义UDF时才可以这样做。
在rdbms世界中理想的查询是
Select name, COUNT(*) FROM table_name GROUP BY name;
但由于cassandra不直接支持,因此您可以使用Map将自定义UDF写入Group。