2015-07-28 20 views
1

我在卡桑德拉一個以下數據集:InvalidRequest:代碼= 2200 [查詢無效]消息= 「運算符無效> =用於PRIMARY KEY部分」

表結構

CREATE TABLE userlog (
term text, 
ts timestamp, 
year int, 
month int, 
day int, 
hour int, 
weekofyear int, 
dayofyear int, 
count counter, 
PRIMARY KEY (term, ts, year,month,day,hour,weekofyear,dayofyear) 
); 

term    | ts      | year | month | day | hour | weekofyear | dayofyear | count 
------------------+--------------------------+------+-------+-----+------+------------+-----------+------- 
www.datastax.com | 2028-07-13 17:06:28+0530 | 2015 |  7 | 28 | 16 |   31 |  209 |  2 
www.datastax.com | 2015-07-28 16:17:36+0530 | 2015 |  7 | 28 | 16 |   31 |  209 |  6 
www.datastax.com | 2015-07-28 16:17:36+0530 | 2015 |  7 | 28 | 16 |   31 |  209 |  2 
www.datastax.com | 2015-07-28 16:17:36+0530 | 2015 |  7 | 28 | 16 |   31 |  209 |  2 
www.datastax.com | 2015-07-28 16:21:15+0530 | 2015 |  7 | 28 | 16 |   31 |  209 |  2 
www.datastax.com | 2015-07-28 16:21:33+0530 | 2015 |  7 | 28 | 16 |   31 |  209 |  2 
www.datastax.com | 2015-07-28 16:21:50+0530 | 2015 |  7 | 28 | 16 |   31 |  209 |  2 
www.datastax.com | 2015-07-28 16:21:52+0530 | 2015 |  7 | 28 | 16 |   31 |  209 |  2 
www.datastax.com | 2015-07-28 16:21:53+0530 | 2015 |  7 | 28 | 16 |   31 |  209 |  2 
      www | 2015-07-28 16:46:00+0530 | 2015 |  7 | 28 | 16 |   31 |  209 |  2 
      www. | 2015-07-28 16:47:00+0530 | 2015 |  7 | 28 | 16 |   31 |  209 |  2 
      www. | 2015-07-28 16:48:00+0530 | 2015 |  7 | 28 | 16 |   31 |  209 |  2 
      www. | 2015-07-28 16:50:00+0530 | 2015 |  7 | 28 | 16 |   31 |  209 |  2 
      www. | 2015-07-28 16:55:00+0530 | 2015 |  7 | 28 | 16 |   31 |  209 |  2 

當我運行此查詢:

SELECT * FROM userlog WHERE ts >= '2015-07-28 16:46' AND ts <= '2015-07-28 16:55' ALLOW FILTERING; 

我得到正確的結果:

term | ts      | year | month | day | hour | weekofyear | dayofyear | count 
------+--------------------------+------+-------+-----+------+------------+-----------+------- 
www | 2015-07-28 16:46:00+0530 | 2015 |  7 | 28 | 16 |   31 |  209 |  2 
www. | 2015-07-28 16:47:00+0530 | 2015 |  7 | 28 | 16 |   31 |  209 |  2 
www. | 2015-07-28 16:48:00+0530 | 2015 |  7 | 28 | 16 |   31 |  209 |  2 
www. | 2015-07-28 16:50:00+0530 | 2015 |  7 | 28 | 16 |   31 |  209 |  2 
www. | 2015-07-28 16:55:00+0530 | 2015 |  7 | 28 | 16 |   31 |  209 |  2 

但是當我嘗試用相同的條件刪除行

DELETE FROM userlog WHERE ts >= '2015-07-28 16:46' AND ts <= '2015-07-28 16:55'; 

它拋出以下錯誤:

InvalidRequest: code=2200 [Invalid query] message="Invalid operator >= for PRIMARY KEY part ts" 

我錯過了什麼嗎?如何刪除指定時間範圍內的數據?另外,有沒有什麼辦法在指定的時間範圍內獲取數據(除了我正在做的事情?)

回答

3

DELETE命令不支持範圍查詢或ALLOW FILTERING子句。從文檔中只支持=和IN操作符:

您可以通過完全指定分區列和聚簇列來刪除單個行。

您可以通過指定分區鍵來刪除整個分區。

而且您可以使用IN運算符一次執行其中的一部分。

如果要有選擇地刪除分區內的行,可以先使用SELECT查詢它們,然後在應用程序中發出從SELECT返回的每一行的刪除操作。

通常情況下,您不希望在SELECT語句中使用ALLOW FILTERING,因爲效率非常低,因此通常在執行範圍查詢SELECT時指定分區鍵。您可以構建架構,以便操作所需的信息位於已知分區中,這樣您就不需要執行全表掃描即可查找事物。

+0

'如果要選擇性刪除分區內的行,可以先使用SELECT查詢它們,然後在應用程序中發出從SELECT返回的每一行的刪除操作。' 如何做到這一點?通過選擇結果刪除語句? –

+0

我能夠迭代並獲得結果 'ResultSet result = session.execute(insertUpdateTable); (result.iterator()。hasNext()) while(result.iterator()。hasNext()) { \t System.out.println(result.one()); }' 如何將它傳遞給刪除語句? –

+0

吉姆,很好的回答!圍繞CQL DELETE有很多困惑,所以很高興看到它像這樣拼寫出來。 – Aaron