2015-07-28 46 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