Cassandra包含查询错误

时间:2015-07-15 21:26:51

标签: cassandra cql cassandra-2.0

我是Cassandra的新手,并试图弄清楚如何使用Cassandra获得一个简单的包含查询。

我的表格看起来像这样

CREATE TABLE events (
  timekey text,
  id timeuuid,
  event_types list<text>,
  PRIMARY KEY ((timekey), id)
)

我的查询:

cqlsh> select count(1) from events where event_types contains 'foo';

**Bad Request: line 1:46 no viable alternative at input 'contains'**

有关错误的任何想法?

还可以在一个查询中查询多个event_types。我无法通过Contains看到任何方法。在常规sql

中与此相当的东西

关系SQL示例:

select count(1) from events where event_types in ('foo', 'bar')

1 个答案:

答案 0 :(得分:2)

有几件事。首先,当我创建模式时,插入一行,我得到的错误信息与您不同:

aploetz@cqlsh:stackoverflow2> CREATE TABLE events (
              ...   timekey text,
              ...   id timeuuid,
              ...   event_types list<text>,
              ...   PRIMARY KEY ((timekey), id)
              ... );
aploetz@cqlsh:stackoverflow2> INSERT INTO events (timekey, id, event_types) 
    VALUES ('1', now(),['foo','bar']);
aploetz@cqlsh:stackoverflow2> select count(1) from events where event_types contains 'foo';
InvalidRequest: code=2200 [Invalid query] message="No secondary indexes on the restricted
    columns support the provided operators: "

要使其生效,您需要在event_types集合上创建辅助索引。当然,集合上的二级索引是new feature as of Cassandra 2.1。由于您的错误消息不同,我猜您需要升级到2.1。

我现在正在沙盒中使用2.1.5,所以当我在event_types上创建索引时,这可行:

aploetz@cqlsh:stackoverflow2> CREATE INDEX eventTypeIdx ON events(event_types);
aploetz@cqlsh:stackoverflow2> select count(1) from events where event_types contains 'foo';

 count
-------
     1

(1 rows)

即使这可能有效,但已知大型表或大型集群中的二级索引表现不佳。我希望集合上的二级索引表现得更差,所以只需将其作为警告。

  

是否可以在一个查询中查询多个event_types?

有很多方法可以实现这一目标,但我建议您针对上述性能问题采取相应措施。如果您有兴趣,我在这里回答了类似的问题:Cassandra CQL where clause with multiple collection values?