【发布时间】:2017-07-19 17:11:08
【问题描述】:
我在 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
但是,我怀疑使用 token 实际上并没有给我基于时间的查询,因为 token(epoch) 和 token(epoch+100) 可能没有与 epoch 和 epoch+100 相同的线性关系。
示例:
Select * from tmp2 where token(epoch) <= token(7009) and token(epoch) >= token(7595);
epoch
-------
(0 rows)
- 有没有办法以 1 分钟为单位查询基于 epoch 的分区列?或
- 有没有办法在存储数据的同时去掉 epoch 的毫秒和秒,让 epoch 的分辨率只有一分钟,我可以很容易地指定分区分钟?
【问题讨论】:
-
你知道数据插入的时间吗?
-
我希望在 CQL 本身内将时代转换为分钟。像
INSERT INTO tmp2 (epoch) values (setResolutionToLastMinute(now()))这样的东西。 CQL 有什么东西可以将 now() 的分辨率降低到一分钟吗?