如何在Cassandra中查询简单的基于纪元的分区列?

时间:2017-02-28 16:13:02

标签: cassandra cql

在Cassandra中查询时我不知道主键 我所知道的是我想要获取数据的时间范围 所以我把表格的分区键保存为纪元。

CREATE TABLE tmp2 (
    epoch bigint,
    primary key (epoch)
);

INSERT INTO tmp2 (epoch) values (unixTimestampOf(now()));
INSERT INTO tmp2 (epoch) values (unixTimestampOf(now()));
INSERT INTO tmp2 (epoch) values (unixTimestampOf(now()));
INSERT INTO tmp2 (epoch) values (unixTimestampOf(now()));
INSERT INTO tmp2 (epoch) values (unixTimestampOf(now()));


select * from tmp2;
 epoch
---------------
 9410
 8171
 7595
 8746
 6009

注意:我已经通过删除公共前缀148826477将时期减少到更可读的数字

我尝试根据纪元范围查询此表:

Select * from tmp2 where epoch >= 6009 and epoch <= 7595;
InvalidRequest: Only EQ and IN relation are supported on the partition key (unless you use the token() function)

所以我使用了token()函数,一切都很好:

Select * from tmp2 where token(epoch) <= token(6009) and token(epoch) >= token(7595);
 epoch
---------------
 7595
 8746
 6009

但是,我怀疑使用令牌实际上并不是基于时间给我查询,因为令牌(纪元)和令牌(纪元+100)可能与纪元和纪元+ 100没有相同的线性关系。
例如:

Select * from tmp2 where token(epoch) <= token(7009) and token(epoch) >= token(7595);

 epoch
-------
(0 rows)
  1. 有没有办法在1分钟的块中查询基于纪元的分区列? OR
  2. 有没有办法在存储数据的同时消除纪元中的毫秒和秒数,以便纪元的分辨率只有一分钟,我可以轻松指定分区几分钟?

1 个答案:

答案 0 :(得分:0)

  

但是,我怀疑使用令牌实际上并没有给我   基于时间查询,因为令牌(纪元)和令牌(纪元+ 100)可能   没有与纪元和纪元相同的线性关系+ 100有。

你的可疑是正确的。它们确实是两个非常不同的东西。我recently posted explanation关于数据查询和令牌功能查询之间的区别。

回到你的问题:

  1. 不,除非你的分区密钥已经以1分钟的粒度
  2. ,否则无法执行此类任务
  3. 不,您必须在客户端代码上围绕将其插入到时间戳列中。
  4. 如果您只是按my advice上的your previous question,就可以在眨眼间解决问题。

    我想补充说cassandra中的一个基本内容是在查询数据时确实需要知道分区键,这就是错误所说的。