获取每个用户的关注者数量

时间:2016-11-10 15:35:23

标签: cassandra cql

我有下表。是否可以通过单个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';

2 个答案:

答案 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。

请参阅https://stackoverflow.com/a/33223749/2990458