1

我有一张如下表。

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 这将扫描整个记录且效率低下。

4

3 回答 3

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';

或者另一个例子,我按天对数据进行分区(这将导致数据很好地跨集群传播),并执行范围查询:

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上有一篇关于时间序列数据的非常有用的文章

于 2015-01-14T17:08:28.380 回答
3

如果没有使用 allow filter 明确要求它,则不允许您按范围限制主键。这可以防止需要全表扫描的查询,正如您所注意到的那样,这种查询速度很慢,并且无法针对真正的大数据大小进行扩展。这样做的原因是主键值是随机散列的,因此指定一个主键值范围基本上与提供两个松散耦合的随机数相同。例如,在您的情况下,日期很可能不是单调散列的。这意味着您希望日期的哈希值小于另一个值的哈希值将返回一组完全随机的数据。

这里的问题是您的表设置不允许您实际想要执行的查询。您需要对表进行建模,以便可以从单个分区中获取所需的信息。

于 2015-01-14T13:50:53.747 回答
0

日期范围查询工作正常。我正在使用以下版本

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

旧版本可能存在问题。请检查。

于 2015-01-14T13:18:20.823 回答