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

Ani*_*nil 7 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)"
Run Code Online (Sandbox Code Playgroud)

它不适用于>或任何范围选择,而它适用于=就索引而言它只有一个主键没有分区键.为什么它要求token().

我想检索相对范围可以只有日期或日期与时间不同db存在特定时间戳.

Vis*_*ohn 17

我想你对Cassandra术语有点困惑.

请参考这里

partition key: The first column declared in the PRIMARY KEY definition

即,当你创建这样的表时

CREATE TABLE table {
 key1, 
 key2,
 key3,
 PRIMARY KEY (key1, key2, key3)
}
Run Code Online (Sandbox Code Playgroud)

key1被称为分区键key2,key3被称为簇键.

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

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

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

CREATE TABLE TEST_PAYLOAD
(
  BUCKET varchar,
  TIME_STAMP timestamp,
  TYPE text,
  PRIMARY KEY (BUCKET, TIME_STAMP)
);
Run Code Online (Sandbox Code Playgroud)

对于BUCKET,您可以提供年份或年份和月份组合.所以你的密钥看起来像2013年,2014年,06-2014,10-2014等.

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

  • 你是绝对正确的@约翰,非常感谢!! 刚才我想通了.对cassandra来说有点困惑. (2认同)