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

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

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

最佳答案

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

相关文章:

在 Cassandra 中按 timeuuid 类型的主键排序

java - MapReduce 上 Cassandra 执行错误

java - '? 附近更新查询中的语法错误在 Eclipse 中但在 MySQL Workbench 中工作

mysql - 使用 SQL 查询向表添加动态内容

sql - 从数据库中选择早于最新 100 条记录的记录

php - 将多个值从表单插入数组

cassandra - cql/cassandra 中是否有 "alter table add column if column not exists"的等效查询?

java - Gradle - 来自单个项目的多个 Jar

java - 无法从可执行 jar 中找到 javac 编译器

java - 每个 Java 程序使用哪个网络接口(interface)?