计算不同的值

时间:2017-04-18 14:14:32

标签: 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
27Aug2013    4

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

如何计算唯一user_id的数量?

2 个答案:

答案 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反模式(热排等),但它对我有用。