Java Cassandra:分区键上只支持EQ和IN-relation(除非使用token()函数)

Java Cassandra:分区键上只支持EQ和IN-relation(除非使用token()函数),java,sql,cassandra,nosql,Java,Sql,Cassandra,Nosql,表: 它不适用于>或任何范围选择,而适用于=就索引而言,它只有一个主键,没有分区键。为什么它要求令牌() 我想检索相对范围,可以是日期,也可以是数据库中不存在特定时间戳的日期。我想您可能对Cassandra术语有点困惑 请参阅 分区键:主键定义中声明的第一列 也就是说,当你创建这样一个表时 CREATE TABLE TEST_PAYLOAD ( TIME_STAMP timestamp, TYPE text, PRIMARY KEY (TIME_STAMP) ); time_st

表:

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


我想检索相对范围,可以是日期,也可以是数据库中不存在特定时间戳的日期。

我想您可能对Cassandra术语有点困惑

请参阅

分区键:主键定义中声明的第一列

也就是说,当你创建这样一个表时

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)"
CREATE TABLE table {
 key1, 
 key2,
 key3,
 PRIMARY KEY (key1, key2, key3)
}
key1
称为分区键
key2
key3
称为集群键

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

还应在集群键上执行范围查询(<,>)

如果主键没有任何其他候选项,我认为应该像这样重新构建表

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)"
CREATE TABLE table {
 key1, 
 key2,
 key3,
 PRIMARY KEY (key1, key2, key3)
}
对于BUCKET,您可以提供年或年和月组合。所以你的钥匙看起来像2013、2014、06-2014、10-2014等等


因此,在查询go to the desired bucket and do range scans(如TIME_STAMP>='2013-05-15 00:00:00-0700'

BTW)时,我能够得到部分结果,即数据库中特定的数据不是相对范围,但仍在查找分区键错误的原因。下面的查询解决了我的范围问题。从测试有效负载中选择*TOKEN(时间戳)>=TOKEN('2013-05-15 00:00:00-0700')和TOKEN(时间戳),您完全正确@John,非常感谢!!刚才我明白了,作为卡桑德拉的新手,我有点困惑。