2016-03-07 70 views
4

我用來創建表如下代碼:找到非主鍵列的唯一值CQL卡桑德拉

CREATE KEYSPACE mykeyspace 
WITH REPLICATION = { 'class' : 'SimpleStrategy', 'replication_factor' : 1 }; 
USE mykeyspace; 
CREATE TABLE users (
    user_id int PRIMARY KEY, 
    fname text, 
    lname text 
); 
INSERT INTO users (user_id, fname, lname) 
    VALUES (1745, 'john', 'smith'); 
INSERT INTO users (user_id, fname, lname) 
    VALUES (1744, 'john', 'doe'); 
INSERT INTO users (user_id, fname, lname) 
    VALUES (1746, 'john', 'smith'); 

我想找到lname列的不同值(即不是主鍵)。我希望得到以下結果:

lname 
------- 
smith 

通過使用SELECT DISTINCT lname FROM users; 但是,由於lname不是PRIMARY KEY我得到以下錯誤:

InvalidRequest: code=2200 [Invalid query] message="SELECT DISTINCT queries must 
only request partition key columns and/or static columns (not lname)" 
cqlsh:mykeyspace> SELECT DISTINCT lname FROM users; 

如何從lname得到不同的值?

回答

6

Undefined_variable提出了兩個好點:

  • 在卡桑德拉,你需要建立數據模型,以配合您的查詢模式。這有時意味着將數據複製到其他表中,以獲得所需級別的查詢靈活性。
  • DISTINCT只適用於分區鍵。

因此,爲了得到這個工作的一種方式,是建立一個特定的表,以支持該查詢:我跑你的插件,以這個新的查詢表後

CREATE TABLE users_by_lname (
    lname text, 
    fname text, 
    user_id int, 
    PRIMARY KEY (lname, fname, user_id) 
); 

現在,這個工程:

[email protected]:stackoverflow> SELECT DISTINCT lname FROm users_by_lname ; 

lname 
------- 
smith 
    doe 

(2 rows) 

注:在該表中,具有相同的分區鍵(lname)所有行將由fname排序,fname是一個聚集鍵。我添加了user_id作爲附加的集羣密鑰,以確保唯一性。

4

在cassandra中沒有這樣的功能。 DISTINCT僅適用於分區鍵。 您應該根據您的要求設計您的數據模型。 你必須處理在應用程序邏輯中的數據(火花可能是有用的)

+0

謝謝。我確實使用了SPARK。你能否詳細說明如何完成?我認爲獨特是非常普遍的事情。在SPARK(Scala)中沒有現成的代碼,我可以使用它嗎? – Avi

+1

嗨不要使用Scala,但這裏有幾個鏈接,可能有助於http://stackoverflow.com/questions/30959955/how-does-distinct-function-work-in-spark和http://stackoverflow.com/questions/24312113 /高效-計數不同與 - apache的火花 –