我有一个如下所示的表格。
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 字段中的日期时间范围进行搜索。当我尝试使用 token() 之类的方法时
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 进行扫描,但我需要提供 ALLOW FILTERING,这将扫描整个记录且效率低下。
最佳答案
要进行范围查询,您需要将此列作为聚类列。
在这种情况下它会很高效,因为聚类列是按顺序存储的。如果要查找数据,需要指定partition key。
举个例子,我使用 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';
或者另一个例子,我按天对数据进行分区(这会很好地跨集群传播数据),并执行范围查询:
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 上有一篇关于时间序列数据的非常有用的文章
关于java - 仅日期范围扫描 Cassandra CQL 时间戳,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27942152/