获取每个用户的关注者数量
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 写入组。
参考
我有以下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 写入组。
参考