【问题标题】:Cassandra: Only EQ and IN relation are supported on the partition key (unless you use the token() function)Cassandra:分区键仅支持 EQ 和 IN 关系(除非您使用 token() 函数)
【发布时间】:2015-02-10 20:06:24
【问题描述】:

表:

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

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

【问题讨论】:

  • 顺便说一句,我能够获得部分结果,即数据库中特定的数据不是相对范围,但仍在寻找分区键错误出现的原因。以下查询解决了我的范围问题。 SELECT * FROM TEST_PAYLOAD WHERE TOKEN(TIME_STAMP)>=TOKEN('2013-05-15 00:00:00-0700') AND TOKEN(TIME_STAMP)

标签: java sql cassandra nosql


【解决方案1】:

我猜您对 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'

【讨论】:

  • 你是绝对正确的@John,非常感谢!!刚才我想通了。刚接触 cassandra 有点困惑。
猜你喜欢
  • 2018-04-05
  • 1970-01-01
  • 1970-01-01
  • 2021-11-22
  • 2018-03-27
  • 2017-06-11
  • 2017-02-18
  • 1970-01-01
  • 2017-12-06
相关资源
最近更新 更多