如何使用 cassandradb 计数器表进行查询

Posted

技术标签:

【中文标题】如何使用 cassandradb 计数器表进行查询【英文标题】:how to do a query with cassandradb counter table 【发布时间】:2015-01-17 11:08:14 【问题描述】:

我在 Cassandradb 中有一张表,如下所述:

CREATE TABLE remaining (owner varchar,buddy varchar,remain counter,primary key(owner,buddy));

通常我在 REMAIN 字段上做一些 inc/dec 操作,使用如下 cql:

update remaining set remain=remain + 1 where owner='userA' and buddy='userB';
update remaining set remain=remain + 1 where owner='userA' and buddy='userC';
....

现在我需要找出 userA 的所有好友,它的 REMAIN 字段大于 1。当我使用时:

select buddy,remain from remaining where owner='userA' and remain > 0;

给我一​​个错误:

No indexed columns present in by-columns clause with Equal operator

如何以 cassandradb 方式执行此操作?

【问题讨论】:

【参考方案1】:

对此的简短回答是,您不能对 Cassandra 中的计数器列使用条件进行查询。

这背后的原因是所有 Cassandra 查询都需要围绕该特定表的主键进行建模。计数器列不允许作为表的主键的一部分(它们的变化值会导致磁盘上数据的不断重组)。计数器列更多地用于跟踪已知数据的状态,例如照片被投票的次数。只要我们知道我们对哪张照片感兴趣,就可以很快回忆起这一点。要实际按票数对照片进行排序,您需要使用 spark 或 Hadoop 执行分析式查询。

【讨论】:

以上是关于如何使用 cassandradb 计数器表进行查询的主要内容,如果未能解决你的问题,请参考以下文章

具有多个 Key-Value 的 CassandraDB 表

如何使用计数查询来(自动)更新表中的列

如何使用linq获取表中值的计数

如何使用单个查询获取存储在不同变量中的多个表行的计数?

如何使用 EFCore 获取一个表的主键计数到另一个表

根据 3 到 4 个条件对数据库表中的行进行计数和分组查询