使用select和cql中的where时出现cassandra错误

时间:2015-03-04 14:51:38

标签: cassandra cql cqlsh

我有一个cassandra表定义如下:

CREATE TABLE test.test(
id text,
time bigint,
tag text,
mstatus boolean,
lonumb  int,
PRIMARY KEY (id, time, tag)
)

我想使用select选择一列。 我试过了:

select * from test where lonumb = 4231;    

它给出了:

code=2200 [Invalid query] message="No indexed columns present in by-columns clause with Equal operator"

我也做不到

select * from test where mstatus = true;

不是cassandra支持where作为CQL的一部分吗?如何纠正这个?

2 个答案:

答案 0 :(得分:3)

您只能在索引列或主键列上使用WHERE。要纠正您的问题,您需要创建一个索引。

CREATE INDEX iname 
ON keyspacename.tablename(columname)

您可以看到更多信息here

但是你必须记住,这个查询必须针对集群中的所有节点运行。

或者,如果lonumb是您最常查询的内容,则可以重新考虑您的表格结构。

答案 1 :(得分:2)

Jny是正确的,WHERE仅对PRIMARY KEY中的列有效,或者为其创建了二级索引。解决此问题的一种方法是为lonumb查询创建特定的查询表。

CREATE TABLE test.testbylonumb(
  id text,
  time bigint,
  tag text,
  mstatus boolean,
  lonumb  int,
  PRIMARY KEY (lonumb, time, id)
)

现在,此查询将起作用:

select * from testbylonumb where lonumb = 4231; 

它将返回lonumb = 4231的所有CQL行,按time排序。我将id放在PRIMARY KEY上以确保唯一性。

select * from test where mstatus = true;

这个比较棘手。低基数列(如布尔值)上的索引和键通常被认为是一个坏主意。看看是否有另一种方式可以对其进行建模。否则,您可以在mstatus上尝试使用辅助索引,但只能在指定分区键(在本例中为lonumb)时使用它,如下所示:

select * from testbylonumb where lonumb = 4231 AND mstatus = true;

也许这样做不会太糟糕,因为你将它限制在一个特定的分区。但我绝对不会在SELECT * mstatus上做{{1}}。