2015-01-14 71 views
1

我有一張表,如下所示。只有日期範圍掃描Cassandra CQL時間戳

CREATE TEST(
HOURLYTIME TIMESTAMP, 
FULLTIME TIMESTAMP, 
DATA TEXT, 
PRIMARY KEY(HOURLYTIME,FULLTIME) 
) 

我插入記錄(2014-12-12 00:00:00,2014-12-12 00:00:01,'Hello World')

我想搜索基於在HOURLYTIME領域持有每小時records.When我試着用令牌()一樣

select * from TEST where token(HOURLYTIME)=token('2014-12-12')

日期時間範圍

以獲得該日期的所有記錄,它僅返回一小時記錄,即對於

2014-12-12 **00:00:00** 

如果我添加日期範圍

select * from TEST where token(HOURLYTIME)>=token('2014-12-12') AND token(HOURLYTIME)<=token('2014-12-14'); 

它給人的錯誤:一個以上的限制被發現的束縛開始。

如何解決此問題。

我能夠掃描使用FULLTIME,但我需要提供允許篩選,將掃描整個記錄&效率低下。

+0

非常有用的文章,你可以嘗試> 2014-12-12 00:00:00&<2014-12-12 23:59:59 ... –

回答

3

您不允許通過範圍限制主鍵而不明確要求允許過濾。這樣可以防止需要進行全表掃描的查詢,因爲您注意到該查詢速度很慢,並且不會針對真正的大數據大小進行縮放其原因是主鍵值是隨機散列的,因此指定一個主鍵值範圍與提供兩個鬆散耦合的隨機數基本相同。例如在你的情況下,日期很可能不是單調散列。這意味着你想要的日期散列值小於另一個值的散列將返回一個完全隨機的數據集。

這裏的問題是您的表設置不允許您實際想要執行的查詢。您需要爲表格建模,以便可以從單個分區獲取所需的信息。

0

日期範圍查詢工作正常。我正在使用以下版本

[cqlsh 4.1.0 | Cassandra 2.0.4 | CQL spec 3.1.1 | Thrift protocol 19.39.0] 

舊版本可能有問題。請檢查。

4

要進行範圍查詢,您需要將此列作爲聚類列。

在這種情況下,它將是有效的,導致聚類列存儲排序。如果你想搜索數據,你需要指定分區鍵。

因此,作爲一個例子,在這裏我使用DEVICE_ID作爲分區鍵:

CREATE TABLE IF NOT EXISTS mykeyspace.device_data (
DEVICE_ID text, 
HOURLYTIME TIMESTAMP, 
FULLTIME TIMESTAMP, 
DATA TEXT, 
PRIMARY KEY (DEVICE_ID, HOURLYTIME, FULLTIME) 
); 

INSERT INTO mykeyspace.device_data (device_id, hourlytime, fulltime, data) 
values('Spam machine', '2014-12-12 00:01:00','2014-12-12 00:00:01','Hello World1'); 

INSERT INTO mykeyspace.device_data (device_id, hourlytime, fulltime, data) 
values('Spam machine', '2014-12-12 00:02:00','2014-12-12 00:00:02','Hello World2'); 

INSERT INTO mykeyspace.device_data (device_id, hourlytime, fulltime, data) 
values('Spam machine', '2014-12-12 00:03:00','2014-12-12 00:00:03','Hello World3'); 

-- Effective range query 
SELECT * FROM mykeyspace.device_data 
WHERE device_id = 'Spam machine' 
    AND hourlytime > '2014-12-12 00:00:00' 
    AND hourlytime < '2014-12-12 00:02:00'; 

或者另一示例,其中,I白天分區數據(這將導致在集羣很好地擴展的數據),並執行範圍查詢:

CREATE TABLE IF NOT EXISTS mykeyspace.day_data (
    DAYTIME timestamp, 
    HOURLYTIME TIMESTAMP, 
    FULLTIME TIMESTAMP, 
    DATA TEXT, 
    PRIMARY KEY (DAYTIME, HOURLYTIME, FULLTIME) 
); 

INSERT INTO mykeyspace.day_data (DAYTIME, hourlytime, fulltime, data) 
values('2014-12-12', '2014-12-12 00:01:00','2014-12-12 00:00:01','Hello World1'); 

INSERT INTO mykeyspace.day_data (DAYTIME, hourlytime, fulltime, data) 
values('2014-12-12', '2014-12-12 00:02:00','2014-12-12 00:00:02','Hello World2'); 

INSERT INTO mykeyspace.day_data (DAYTIME, hourlytime, fulltime, data) 
values('2014-12-12', '2014-12-12 00:03:00','2014-12-12 00:00:03','Hello World3'); 

SELECT * FROM mykeyspace.day_data 
WHERE daytime = '2014-12-12' 
    AND hourlytime > '2014-12-12 00:00:00' 
    AND hourlytime < '2014-12-12 00:02:00'; 

有一個關於時間序列數據上PlanetCassandra