Предикаты Cassandra для столбцов без первичного ключа (тип события) еще не поддерживаются для запросов не вторичного индекса - PullRequest
0 голосов
/ 18 октября 2018

Я разработал таблицу, как показано ниже, с первичным ключом в качестве идентификатора, который имеет тип uuid

 id                                   | date                     | eventtype    | log      | password | priority | sessionid | sourceip     | user       | useragent
--------------------------------------+--------------------------+--------------+----------+----------+----------+-----------+--------------+------------+------------
 6b47e9b0-d11a-11e8-883c-5153f134200b |                     null | LoginSuccess |  demolog |     1234 |       10 |    Demo_1 | 123.12.11.11 |       Aqib |  demoagent
 819a58d0-cd3f-11e8-883c-5153f134200b |                     null | LoginSuccess |  demolog |     1234 |       10 |    Demo_1 | 123.12.11.11 |       Aqib |  demoagent
 f4fae220-d133-11e8-883c-5153f134200b | 2018-10-01 04:01:00+0000 | LoginSuccess |  demolog |     1234 |       10 |    Demo_1 | 123.12.11.11 |       Aqib |  demoagent

Но когда я пытаюсь запросить что-то вроде ниже

select * from loginevents where eventtype='LoginSuccess';

iполучить ошибку, как показано ниже

InvalidRequest: Error from server: code=2200 [Invalid query] message="Predicates on non-primary-key columns (eventtype) are not yet supported for non secondary index queries"

Это моя таблица

cqlsh:events> describe loginevents;

CREATE TABLE events.loginevents (
    id uuid PRIMARY KEY,
    date timestamp,
    eventtype text,
    log text,
    password text,
    priority int,
    sessionid text,
    sourceip text,
    user text,
    useragent text
) WITH bloom_filter_fp_chance = 0.01
    AND caching = '{"keys":"ALL", "rows_per_partition":"NONE"}'
    AND comment = ''
    AND compaction = {'class': 'org.apache.cassandra.db.compaction.SizeTieredCompactionStrategy'}
    AND compression = {'sstable_compression': 'org.apache.cassandra.io.compress.LZ4Compressor'}
    AND dclocal_read_repair_chance = 0.1
    AND default_time_to_live = 0
    AND gc_grace_seconds = 864000
    AND max_index_interval = 2048
    AND memtable_flush_period_in_ms = 0
    AND min_index_interval = 128
    AND read_repair_chance = 0.0
    AND speculative_retry = '99.0PERCENTILE';

Как я могу решить эту проблему

Ответы [ 2 ]

0 голосов
/ 18 октября 2018

Непосредственным ответом на ваш вопрос будет создание вторичного индекса для столбца eventtype, например:

CREATE INDEX my_index ON events.loginevents (eventtype);

Затем вы можете выполнить фильтрацию по этому конкретному столбцу:

SELECT * FROM loginevents WHERE eventtype='LoginSuccess';

Однако это решение может негативно повлиять на производительность вашего кластера.

Если вы пришли из мира SQL и не знакомы с Cassandra, прочитайте введение по моделированию Cassandra, например this .

Прежде всего нужно определить запрос, а затем создать таблицу в соответствии с.

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

В вашем случае, возможно, хорошим началом будет группировка ваших записей на основе eventtype:

CREATE TABLE events.loginevents (
  id uuid,
  date timestamp,
  eventtype text,
  log text,
  password text,
  priority int,
  sessionid text,
  sourceip text,
  user text,
  useragent text,
  PRIMARY KEY (eventtype, id)

)

Затем вы можете выбрать вот так:

SELECT * FROM loginevents WHERE eventtype='LoginSuccess';

или даже:

SELECT * FROM loginevents WHERE eventtype in ('LoginSuccess', 'LoginFailure');

(Это не идеальная модель, ее обязательно нужно улучшить перед производством.)

0 голосов
/ 18 октября 2018

В Cassandra вы можете запрашивать только по первичному ключу и некоторым столбцам кластеризации, и невозможно выполнить запрос по всем полям.если вы хотите выполнить запрос к «типу события», вы должны использовать вторичные индексы в определении таблицы или таблицы индексов Apache Solr и выполнять запросы с использованием Solr.Некоторые вещи, как показано ниже:

CREATE INDEX loginevents_type
   ON events.loginevents (eventtype);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...