表格:
CREATE TABLE TEST_PAYLOAD
(
TIME_STAMP timestamp,
TYPE text,
PRIMARY KEY (TIME_STAMP)
);
time_stamp | type
--------------------------+----------
2013-05-15 00:00:00-0700 | sometext
2013-05-16 00:00:00-0700 | sometext
2013-05-17 00:00:00-0700 | sometext
SELECT * FROM TEST_PAYLOAD WHERE TIME_STAMP>='2013-05-15 00:00:00-0700';
code=2200 [Invalid query] message="Only EQ and IN relation are supported on the partition key (unless you use the token() function)"
它不适用于 > 或任何范围选择,而它适用于 = 就索引而言,它只有一个主键,没有分区键。为什么它要求 token()。
我想检索相对范围只能是日期或带时间的日期,数据库中不存在特定时间戳。
最佳答案
我猜您对 Cassandra 术语有点困惑。
请引用here
partition key: The first column declared in the PRIMARY KEY definition
即,当你像这样创建一个表时
CREATE TABLE table {
key1,
key2,
key3,
PRIMARY KEY (key1, key2, key3)
}
key1
称为分区键和key2
, key3
称为聚类键。
在您的情况下,您没有集群键,因此您声明的单个主键成为分区键。
还应该对集群键执行范围查询(<,>)。
如果您没有其他主键候选者,我认为您应该像这样改造您的表
CREATE TABLE TEST_PAYLOAD
(
BUCKET varchar,
TIME_STAMP timestamp,
TYPE text,
PRIMARY KEY (BUCKET, TIME_STAMP)
);
对于 BUCKET,您可以提供年份或年月组合。所以你的 key 看起来像这些 2013、2014、06-2014、10-2014 等。
因此,在查询时转到所需的存储桶并进行范围扫描,如 TIME_STAMP >= '2013-05-15 00:00:00-0700'
关于java - Cassandra:分区键只支持 EQ 和 IN 关系(除非你使用 token() 函数),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27438113/