Cassandra 计算不同的值

Cassandra 计算不同的值,cassandra,cql,Cassandra,Cql,考虑下表: CREATE TABLE users ( date timestamp, user_id text, PRIMARY KEY (date, user_id) ); 以以下数据为例: date user_id 25Aug2013 1 25Aug2013 2 25Aug2013 1 25Aug2013 3 26Aug2013 1 26Aug2013 2 27Aug2013 2 27Aug2013 3 27Au

考虑下表:

CREATE TABLE users (
  date timestamp,
  user_id text,
  PRIMARY KEY (date, user_id)
);
以以下数据为例:

date       user_id

25Aug2013    1
25Aug2013    2
25Aug2013    1
25Aug2013    3

26Aug2013    1
26Aug2013    2

27Aug2013    2
27Aug2013    3
27Aug2013    4

28Aug2013    1
28Aug2013    2
28Aug2013    1
28Aug2013    3

如何计算唯一用户id的数量?

在评论中,我或多或少提到了与问题相关的内容,但我想做一个评论

就我个人而言,当我与卡桑德拉处于类似情况时,我滥用了它的属性,这是一种黑客行为,但我认为在这种情况下它可能“有用”

基本上,我创建了一个单面桌,在那里我放置了所有独特的东西。i、 e

CREATE TABLE stats_unique (
  stat_group text,
  user_id text,
  PRIMARY KEY (stat_group, user_id)
);
写东西通常很便宜,而且我没有遇到额外的简单问题 写吧,毕竟卡桑德拉就是为此而生的。所以每次我插入 要创建基表,我还将插入到
stats\u unique
表中。对于您的示例,它将类似于:

INSERT INTO stats_unique (stat_group, user_id) VALUES ('users', '1');
INSERT INTO stats_unique (stat_group, user_id) VALUES ('users', '2');
INSERT INTO stats_unique (stat_group, user_id) VALUES ('users', '1');
INSERT INTO stats_unique (stat_group, user_id) VALUES ('users', '3');

INSERT INTO stats_unique (stat_group, user_id) VALUES ('users', '1');
INSERT INTO stats_unique (stat_group, user_id) VALUES ('users', '2');

INSERT INTO stats_unique (stat_group, user_id) VALUES ('users', '2');
INSERT INTO stats_unique (stat_group, user_id) VALUES ('users', '3');
INSERT INTO stats_unique (stat_group, user_id) VALUES ('users', '4');

INSERT INTO stats_unique (stat_group, user_id) VALUES ('users', '1');
INSERT INTO stats_unique (stat_group, user_id) VALUES ('users', '2');
INSERT INTO stats_unique (stat_group, user_id) VALUES ('users', '1');
INSERT INTO stats_unique (stat_group, user_id) VALUES ('users', '3');
然后,当我需要uniques时,我只发出了一个简单的请求,如:

SELECT COUNT(1) FROM stats_unique WHERE stat_group = 'users';

 count
-------
     4

(1 rows)
这绝对不是一个标准的解决方案,但它确实是一种东西 这在我的特殊情况下起了作用。考虑到我不能 在这个单独的分区中保存超过数百万的内容 但是系统根本不需要支持那么多实体实例 所以对于我的用例来说,它已经足够好了。同样,使用这种方法,你可能会遇到诸如计数超时等问题

最好是在旁边有一些东西来做这个计数,或者是单独的进程、脚本,或者甚至像他在评论中所说的那样是一个火花进程,它可以帮你计数,并将它放在cassandra或其他存储技术的其他表中

我使用的可能是cassandra anti-pattern(hot row等),但它对我有效。

一个想法可能是使用:

CREATE TABLE stats\u unique(
统计组文本,
用户ID设置,
主键(统计组)
);
Inserts将自动从集合中删除重复项,select将一次检索所有ID,因此您可以在应用程序级别进行计数

如果您只对唯一用户ID的数量感兴趣,而没有实际从磁盘中检索它们,那么恐怕您需要更改的不仅仅是应用程序代码


请记住深入研究。

这个答案可能非常有用:cassandra不支持这种类型的查询。您可以使用spark进行这种类型的查询,但这意味着要更改此查询的应用程序代码,我不希望这样做。一个有效的选项可以是创建临时方法或表,但不必更改我的应用程序,只需查询dbI即可,我完全理解这一点。这对我来说还是很方便的。但我想您可以创建一个类似的结构,然后创建一个触发器,将上面的数据插入到您所称的
temp表中。这是一个关于触发器的有趣答案,也是一个不错的答案。
CREATE TABLE stats_unique (
  stat_group text,
  user_ids set<text>,
  PRIMARY KEY (stat_group)
);