Cassandra:分区键仅支持 EQ 和 IN 关系(除非您使用 token() 函数)

问题描述 投票:0回答:1

表:

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()

我想检索相对范围只能是日期或带时间的日期,而不是数据库中存在的特定时间戳。

java sql cassandra nosql
1个回答
21
投票

我猜您对 Cassandra 术语有点困惑。

请参考这里

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,您可以提供年份或年月组合。所以你的钥匙看起来像 2013、2014、06-2014、10-2014 等。

因此,在查询时,转到所需的存储桶并进行范围扫描,例如 TIME_STAMP >= '2013-05-15 00:00:00-0700'

© www.soinside.com 2019 - 2024. All rights reserved.