2015-01-14 58 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