2014-02-07 116 views
1

时间序列数据建模我有这样的一个表:范围查询 - 在CQL卡桑德拉

CREATE TABLE测试(partitionkey文字,rowkey文本,日期 时间戳,策略ID文本,policyname文字,主键 (partitionkey,rowkey));

一些数据:

partitionkey | rowkey | policyid | policyname |日期

 p1 | r1 | pl1 | plicy1 | 2007-01-02 00:00:00+0000 
    p1 | r2 | pl2 | plicy2 | 2007-01-03 00:00:00+0000 
    p2 | r3 | pl3 | plicy3 | 2008-01-03 00:00:00+0000 

我希望能够找到:

1/ data from a particular partition key 
2/ data from a particular partition key & rowkey 
3/ Range query on date given a partitionkey 

1/2 /是微不足道:

SELECT * FROM测试,其中partitionkey = 'P1';

partitionkey | rowkey | policyid | policyname |范围

p1 |  r1 |  pl1 |  plicy1 | 2007-01-02 00:00:00+0000 
    p1 |  r2 |  pl2 |  plicy2 | 2007-01-03 00:00:00+0000 

但对于3 /? 即使有索引它也不起作用:

在测试(日期)上创建索引i1;

select * from test where partitionkey ='p1'and date = '2007-01-02';

partitionkey | rowkey | policyid | policyname |日期

p1 | r1 | pl1 plicy1 | 2007-01-02 00:00:00+0000 

SELECT * FROM测试,其中partitionkey = 'P1' 和 日期> '2007-01-02';

请求无效:无索引列存在于 逐列条款与平等运营商

任何想法? 感谢, 马特

回答

2

CREATE TABLE测试(partitionkey文本,rowkey文本,日期时间戳, 策略ID文本,文本policyname,主键(partitionkey,rowkey));

首先,你真的应该使用更多的描述性列名而不是partitionkey和rowkey(甚至是日期)。通过查看这些列名,我真的不知道这个表应该被索引到什么样的数据。

select * from test where partitionkey='p1' and date > '2007-01-02'; 

请求无效:无索引列在目前分列条款与平等运营商

对于这个问题,请尝试将“日期”一栏主键的一部分。

primary key (partitionkey, rowkey, date) 

一旦你这样做,我认为你的日期范围查询将正常运作。

欲了解更多信息,请参阅DataStax Academy's(免费)当然称为Java开发与Apache卡桑德拉。第5节,第104单元讨论了如何为时间序列数据建模,这应该对您有所帮助。

+0

只要查询有一个'allow filtering'子句(消息_Bad Request:无法执行此查询,因为它可能涉及数据过滤,因此可能具有不可预知的性能。性能不可预测性,请使用ALLOW FILTERING_)。这是为什么?它如何影响性能? –

+1

我想你会看到那个警告,因为你的'rowkey'没有在该查询中指定。我引用的例子只使用了分区键和日期作为主键......我想你可以尝试将rowkey定义为分区键'primary key((partitionkey,rowkey),date)'的一部分,然后看看是否这有助于。 – Aaron

+0

当然,但这需要我为'rowkey'添加一个我不总是拥有的子句。我想我会接受第一个解决方案,谢谢。 –