【问题标题】:Get count of followers for each user获取每个用户的关注者数量
【发布时间】:2017-03-24 16:53:45
【问题描述】:

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

【问题讨论】:

    标签: cassandra cql


    【解决方案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 上的文档以获取更多信息。

    【讨论】:

      【解决方案2】:

      只有在 cassandra 中使用自定义 UDF 时才有可能。

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

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

      但由于 cassandra 不直接支持这一点,因此您可以改为使用 Map 将自定义 UDF 写入 Group。

      参考https://stackoverflow.com/a/33223749/2990458

      【讨论】:

      • 这将扫描所有数据集。相反,专用表是最好的解决方案,而且差距很大。
      • @xmas79 你是对的。但我想这取决于查询的读写频率。如果此查询很少运行,并且 user_follows 表上的更新/删除频繁,则计数器可能会过大。解决方案的其他方式也可以正常工作。
      猜你喜欢
      • 2013-07-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-20
      • 1970-01-01
      • 2014-08-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多