2017-04-18 59 views
3

下表考虑计数不同的值

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

这个答案可能是非常有用的:http://stackoverflow.com/a/33223749/7413631 –

+0

这种类型的查询在卡桑德拉不支持。你可以使用spark来完成这种类型的查询。 –

回答

0

在评论中我提到了或多或少有关问题的东西,但我想说一个评论。

个人当我在类似的情况卡桑德拉我滥用它的属性,这是有点一个黑客,但我想它可能在这方面是“有用”。

基本上我创建了一个单边桌,我把所有的独特的东西。即

CREATE TABLE stats_unique (
    stat_group text, 
    user_id text, 
    PRIMARY KEY (stat_group, user_id) 
); 

写操作通常是价格便宜,我有另外的简单 写不闹,毕竟卡桑德拉为这个建。所以我每次插入 到基表我也插入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'); 

,然后当我需要的唯一身份我只是发出一个简单的REQ,如:

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

count 
------- 
    4 

(1 rows) 

这不是绝不是一个标准的解决方案,但它是在我的特殊情况下工作的东西 。考虑到我不能 持有超过几百万的东西,更在此单个分区 但系统根本没有支持那么多的实体实例 所以我的使用情况下,它是不够好。此外,有了这个黑客,你可能会遇到像计时等超时问题等

这将是最好有一边做这个计数,无论是单独的过程,脚本,甚至作为Ashraful Islam在他的评论中煽动它的火花进程将为您计数,并将其放到cassandra或其他存储技术中的其他表中。

我使用的可能是卡桑德拉反面模式(热列等),但它为我工作。

+0

但这意味着更改此查询的应用程序代码,我不想要。一个有效的选项可以创建临时方法或表,但不改变我的应用程序,只是查询分贝 – igx

+0

我完全理解这一点。再次,这对我来说很方便。但我想你可以创建一个类似的结构,然后创建一个触发器,在您调用它时将上面的数据插入到“临时表”中。这里是关于触发器的一个有趣的答案http://stackoverflow.com/a/35512606/7413631 –

1

的想法可能是使用set collection

CREATE TABLE stats_unique (
    stat_group text, 
    user_ids set<text>, 
    PRIMARY KEY (stat_group) 
); 

插入它将自动从集合中删除重复,并选择将立即检索所有的ID,所以你在应用程序级计数。

如果你只在唯一user_ids的数量,而不实际从我恐怕你必须改变不是应用程序代码多一点磁盘检索他们的兴趣。

记住有一个深入探讨的collections limitations

+0

也很好。 –