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

时间:2014-12-12 06:32:04

标签: java sql cassandra nosql

表:

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

我想检索相对范围只能是日期或日期,而不是特定时间戳存在于db中。

1 个答案:

答案 0 :(得分:15)

我猜你对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称为分区键key2key3称为群集键

在您的情况下,您没有群集密钥,因此您声明的单个主键成为分区键。

还应对群集密钥执行范围查询(<,>)。

如果您没有任何其他主键候选人,我认为您应该像这样改造您的表

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'