java - 仅日期范围扫描 Cassandra CQL 时间戳

标签 java cassandra cassandra-cli nosql

我有一个如下所示的表格。

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/

相关文章:

java - 仅根据字段名称对类数组进行排序

database - 如何将 AWS Lambda 连接到 Amazon Keyspaces (AWS Cassandra)?

Cassandra CQLSH OperationTimedOut 错误=客户端请求超时。请参阅 Session.execute[_async](超时)

java - Cassandra 2.2.8 : sstableverify - GC overhead limit exceeded

java - Cassandra 错误:Invalid method name "describe local ring"

Cassandra CLI 使用主键创建列族

java - 如何在 Selenium 中按下2个键

java - 无法将 SQLServerDriver 转换为 DataSource

java - 使用反射设置属性的属性

JAVA 代码将信号量与 Cassandra 结合使用来限制executeAsync 写入以消除 NoHostAvailableException 错误