2015-07-15 5 views
1

Я новичок в Cassandra и пытаюсь выяснить, как получить простой запрос, который работает с 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'** 

Любые мысли о ошибке?

Также возможно запросить несколько событий-событий в одном запросе. Я не видел никакого способа сделать это с помощью Содержит. Что эквивалентно это в обычном SQL

Relational пример SQL:

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

ответ

2

Пару вещей. Прежде всего, когда я создать схему, вставить строку, я получаю другое сообщение об ошибке, чем вы:

[email protected]:stackoverflow2> CREATE TABLE events (
       ... timekey text, 
       ... id timeuuid, 
       ... event_types list<text>, 
       ... PRIMARY KEY ((timekey), id) 
       ...); 
[email protected]:stackoverflow2> INSERT INTO events (timekey, id, event_types) 
    VALUES ('1', now(),['foo','bar']); 
[email protected]: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 это работает:

[email protected]:stackoverflow2> CREATE INDEX eventTypeIdx ON events(event_types); 
[email protected]:stackoverflow2> select count(1) from events where event_types contains 'foo'; 

count 
------- 
    1 

(1 rows) 

Даже если это может работать, вторичные индексы на больших столах или в больших кластерах как известно, не работают хорошо. Я ожидал бы, что вторичные индексы по коллекциям будут работать еще хуже, поэтому просто возьмите это как предупреждение.

Также возможно запросить несколько событий-событий в одном запросе?

Есть способы сделать это, но я рекомендую против него для вышеупомянутых проблем с производительностью. Я ответил на аналогичный вопрос здесь, если вы заинтересованы: Cassandra CQL where clause with multiple collection values?

+1

Спасибо @Bryce. Хорошо знать, что это было из-за версии. Кажется, мы недавно понизились с 2,1 до 2,0, так как в тот момент это был самый стабильный выпуск. Угадайте время для обновления. Кроме того, в отношении проблемы с производительностью мой фактический запрос также включает в себя основной/раздел ключа в предложении where. Так что может быть немного лучше –

+0

я бы запросить его, как это «выбрать * от событий где event_types содержит„Foo“ и идентификатор> 04e2c71a-2ae9-11e5-a468-6318a3eb3a8a и timekey в („201506171850“)» –

+0

@Saddy Хорошая идея о включении ключа раздела. Это определенно поможет. – Aaron

Смежные вопросы