考虑下表:
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
如何计算唯一user_id的数量?
答案 0 :(得分:1)
一个想法可能是使用set collection:
CREATE TABLE stats_unique (
stat_group text,
user_ids set<text>,
PRIMARY KEY (stat_group)
);
插入将自动从集合中删除重复项,select将立即检索所有ID,因此您可以在应用程序级别进行计数。
如果您只对唯一的user_ids数量感兴趣而没有从磁盘中实际检索它们,我担心您将不得不更改应用程序代码。
请记得深入了解collections limitations。
答案 1 :(得分:0)
在评论中,我提到了与问题相关的更多或更少的内容,但我想发表评论。
就个人而言,当我遇到与cassandra类似的情况时,我滥用了它拥有的属性,这有点像黑客,但我认为在这种情况下它可能是“有用的”。
基本上我创建了一个单侧表,我把所有独特的东西放在那里。即。
CREATE TABLE stats_unique (
stat_group text,
user_id text,
PRIMARY KEY (stat_group, user_id)
);
写作通常很便宜,而且我没有其他简单的麻烦
毕竟cassandra是为此而建的。所以我每次插入
基表我也插入stats_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)
这绝不是一个标准的解决方案,但它确实存在 这在我的特定情况下有效。考虑到我不能 在这个单独的分区中拥有超过数百万的东西 但系统根本不需要支持那么多实体实例 所以对于我的用例来说它已经足够了。此外,您可能会遇到计数等超时等问题。
最好有一些东西来做这个计算,要么是单独的过程,脚本,要么是Ashraful Islam在他的评论中将它作为一个火花过程,它将为你做计数并把它放到cassandra或其他存储技术中的其他一些表。
我使用的可能是cassandra反模式(热排等),但它对我有用。