2017-04-18 39 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

也很好。 –