2015-09-28 35 views
1

我卡桑德拉表結構如下:卡桑德拉爲了通過,並通過二級索引濾波器

CREATE TABLE sujata 
      ... (ID int, roll_number int, age int, PRIMARY KEY (ID,roll_number)); 

我已經插入了一些記錄,其中ID充當用於多行的分區。我執行以下查詢:

SELECT count(*) FROM sujata WHERE ID=1 ORDER BY roll_number ASC and age=24 Allow Filtering; 

我收到以下錯誤:

missing EOF at 'and' (...1 ORDER BY roll_number ASC [and] age...)"> 

我不知道是否有可能通過執行命令後篩選出的結果。請建議我失蹤的地方。謝謝。

+0

試試這個:SELECT count(*)FROM sujata WHERE ID = 1 and age = 24 ORDER BY roll_number ASC Allow Filtering – arch

+0

上述查詢不起作用,因爲次級索引不支持order by。 – wonder

回答

0
  1. 請勿使用ALLOW FILTERING。它不會執行或不會擴展,因爲它允許您以不支持的 的方式查詢Cassandra。

  2. CQL將您的陳述解釋爲ORDER BY roll_number ASC and age=24,因爲您試圖對兩件事情進行排序。 AND屬於您的WHERE子句,需要在之前指定 ORDER BY。

  3. Cassandra使用您的集羣密鑰來寫入您的數據的 磁盤排序順序。 ORDER BY僅允許您翻轉聚類順序的排序 方向(升序與降序)。所以 如果您已經在您的表 定義中指定了正確的排序順序,那麼您不需要指定ORDER BY。

  4. 爲了雙方IDage查詢表,那麼您需要 與兩列前兩個設計你的主鍵。 您只能查詢您的PRIMARY KEY中定義的列(輔助 索引不能承受),然後只能以相同的順序(您的 不能跳過鍵)。要做到這一點,我創建了一個查詢表 (sujataByIDAndAge),看起來像這樣:

CREATE TABLE sujataByIDAndAge (
    ID int, 
    roll_number int, 
    age int, 
PRIMARY KEY (ID,age,roll_number)); 

現在插入幾行後:

[email protected]:stackoverflow> INSERT INTO sujatabyidandage (id, roll_number, age) 
          VALUES (2, 20, 26); 
[email protected]:stackoverflow> INSERT INTO sujatabyidandage (id, roll_number, age) 
          VALUES (1, 100, 24); 
[email protected]:stackoverflow> INSERT INTO sujatabyidandage (id, roll_number, age) 
          VALUES (1, 110, 24); 
[email protected]:stackoverflow> INSERT INTO sujatabyidandage (id, roll_number, age) 
          VALUES (1, 190, 24); 

現在我可以運行查詢,我也不需要指定ORDER BY或允許過濾:

[email protected]:stackoverflow> SELECT COUNT(*) FROM sujatabyidandage WHERE ID=1 AND age=24; 

count 
------- 
    3 

(1 rows) 

而且值得一提的是,如果結果集順序對您很重要,那麼您必須通過主鍵進行查詢。 Cassandra僅在分區鍵(在你的情況下是ID)內強制執行結果的順序。

+0

你的建議看起來不錯。但我想用非主鍵查詢。如果這是不可能的,那麼查詢可能會導致一個錯誤,但它顯示了一些丟失的EOF。你能告訴我我失蹤的地方嗎? – wonder

+0

@sujata我的第二點詳細介紹了導致你的EOF的原因。 CQL期待你的陳述在'ORDER BY'結束,但你有'AND'後面。 – Aaron

+0

@sujata你也可以通過不指定'ORDER BY'來解決它(我在第3點中提到過)。 – Aaron