2013-07-17 24 views
1

在CQL3表的創建後:CQL選擇行無列

CREATE TABLE data(
row_key text, 
k1 text, 
k2 text, 
PRIMARY KEY (row_key , k1 ,k2) 
); 

我想知道的所有存儲在表卡桑德拉行。但是當我在cqlsh中運行這個時:

SELECT row_key FROM data; 

我找回很多重複的條目。我基本上得到每列我插入的條目。含義:我爲每個(k1 & k2)獲得row_key的條目。

但我的原意是:「給我所有的分區(行)的密鑰列表」。我不想序列化所有列(k1 & k2)。

我在這裏做錯了什麼?

回答

1

我目前熱在我的SELECT查詢中使用「限制1」解決了這個問題。它仍然序列化一列,但不是整行。這總比沒有好。

+0

是的,這是要走的路。我怎麼會錯過這個:/事實上,我使用限制查詢來檢索我的情況下用戶的前5個位置。 –

2

這是CQL3如何代表內部的數據。它爲列創建分區。您需要了解CQL3的存儲模型。 DataStax博客上有關於此的非常好的解讀。看看這些:

http://www.datastax.com/dev/blog/thrift-to-cql3

http://www.datastax.com/dev/blog/cql3-for-cassandra-experts

編輯:
這裏,我們正在處理CQL3不節儉。如果你讀第二個鏈接我的答案(cql3換卡桑德拉 - 專家),你就會明白如何將數據存儲在存儲引擎使用CQL3創建表時。說,我們已經創建瞭如下表:

CREATE TABLE song_tags (
     id uuid, 
     tag_name text, 
     PRIMARY KEY (id, tag_name) 
    ); 

和說,我們有下列各行由一個單一的存儲引擎來表示:

f665cfc469eb | blues | 1973 

    f665cfc469ea | covers | 2003 

這些是由CQL3存儲如下:

|id    | tag_name | 
    ----------------------------- 
    |f665cfc469eb  blues | 
    |f665cfc469eb | 1973  | 
    |        | 
    |f665cfc469ea  covers | 
    |f665cfc469ea | 2003  | 

現在,如果你做了一個SELECT * FROM song_tags;這將是輸出:

id         | column1 | value 
    --------------------------------------+---------+------- 
    8a172618-b121-4136-bb10-f665cfc469ea | 2003 | 
    8a172618-b121-4136-bb10-f665cfc469ea | covers | 
    a3e64f8f-bd44-4f28-b8d9-f665cfc469eb | 1973 | 
    a3e64f8f-bd44-4f28-b8d9-f665cfc469eb | blues | 

P.S實現你想要的;你可以嘗試使用集合和地圖。他們可能會解決你的問題。

+0

的第一個鍵是一個分區鍵。在存儲引擎中,分區鍵用於cassandra存儲行(不是CQL行)。因此,如果我只查詢分區鍵,沒有理由開始序列化列(包含集羣鍵)。我可以在我的CQL查詢或我的CREATE TABLE定義中更改某些內容,以便它不這麼做嗎? – eshalev

+0

k1和k2是主鍵的一部分。每當您爲主鍵中的任何變量創建新值時,cassandra都會創建一個新條目。您可以在查詢中使用SELECT *進行驗證。 –

+0

如果我理解正確的節儉將我的模式映射到數據[row_key] [k1,k2]。其中k1和k2的**值**作爲**列名稱**(每個k1,k2對作爲單列名稱)複合存儲。我應該如何更改模式或查詢以反映問題:「給我所有row_key的值」而不多次獲取每個條目?我應該以不同的方式聲明row_key嗎? – eshalev