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

Get count of followers for each user

我有以下table。是否可以使用单个 CQL select 获得每个用户的关注者数量?

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';

恐怕这不受支持。您唯一可以做的就是对每个分区发出 COUNT(*) 查询。

如果您不知道您的分区,您可以使用 PER PARTITION LIMIT 1 检索每个分区的第一条记录(以及分区键)(分区内的数据按您的簇键排序):

SELECT name FROM user_follows PER PARTITION LIMIT 1;

这需要 Cassandra 3.6 及更高版本。

然而,仔细考虑一下,单个 COUNT 查询(具有分区限制的 WHERE )将生成分区扫描,因为这就是 C* 计算记录的方式。如果您对所有分区发出此查询,那么您将扫描所有数据集,并且可能会终止您的集群。

如果您不需要精确,您可以使用相同的分区键创建一个计数器table并且increment/decrement 每个用户的计数器:

CREATE TABLE user_follows_counts (
    name text PRIMARY KEY, 
    followers counter,
);

现在,您无需扫描数据集即可获得想要的结果,而且查询效率更高:

SELECT * FROM user_follows_counts;

查看 counters 上的文档以获取更多信息。

只有在 cassandra 中使用 Custom UDF 才有可能。

在 rdbms 世界中对此的理想查询是

Select name, COUNT(*) FROM table_name GROUP BY name;

但由于 cassandra 不直接支持此功能,您可以改为使用 Map 将自定义 UDF 写入组。

参考