2014-02-07 158 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'添加一個我不總是擁有的子句。我想我會接受第一個解決方案,謝謝。 –