Выберите конкретную запись в Кассандре, используя cql

Это схема, которую я использую:

CREATE TABLE playerInfo (
key text,
column1 bigint,
column2 bigint,
column3 bigint,
column4 bigint,
column5 text,
value bigint,
PRIMARY KEY (key, column1, column2, column3, column4, column5)
)   
WITH COMPACT STORAGE AND
bloom_filter_fp_chance=0.010000 AND
caching='KEYS_ONLY' AND
comment='' AND
dclocal_read_repair_chance=0.000000 AND
gc_grace_seconds=864000 AND
read_repair_chance=0.100000 AND
replicate_on_write='true' AND
populate_io_cache_on_flush='false' AND
compaction={'class': 'SizeTieredCompactionStrategy'} AND
compression={'sstable_compression': 'SnappyCompressor'};

Обратите внимание, я использую составной ключ. И есть такая запись:

 key      | column1    | column2 | column3  | column4 | column5           | value
----------+------------+---------+----------+---------+--------------------------------------------------+-------
 Kitty    | 1411       |       3 | 713      |       4 |   American        |     1

В cqlshкак его выбрать? Я пытаюсь использовать:

cqlsh:game> SELECT * FROM playerInfo WHERE KEY = 'Kitty' AND column5 = 'American';

но вывод:

Bad Request: PRIMARY KEY part column5 cannot be restricted (preceding part column4 is either not restricted or by a non-EQ relation)

Тогда как я мог выбрать такую ​​ячейку?

2 ответа

Решение

Вы выбрали первичный ключ как PRIMARY KEY (key, column1, column2, column3, column4, column5) так что если вы собираетесь дать предложение where в столбце 5, то вы should also need to specify the where clause of key, column1, column2, column3, column4, например,

SELECT * FROM playerInfo WHERE KEY = 'Kitty' AND column1 = 1411 AND column2 = 3 AND column3 = 713 AND column4 = 4 AND column5 = 'American';

Если вы собираетесь дать пункт where на колонке 2, то вы should also need to specify the where clause of key, column1, например,

SELECT * FROM playerInfo WHERE KEY = 'Kitty' AND column1 = 1411 AND column2 = 3;

Если вы хотите указать условие where в определенном столбце первичного ключа, то также необходимо указать выражение where предыдущего столбца. Таким образом, вам нужно выбрать моделирование данных cassandra хитрым способом, чтобы иметь хорошую производительность чтения и записи, а также для удовлетворения потребностей вашего бизнеса. Но если бизнес-логика вас устраивает, то производительность кассандры вас не удовлетворит. Если производительность Кассандры вас устраивает, то ваша бизнес-логика не удовлетворит вас. Это красота Кассандры. Конечно, Кассандре нужно больше для улучшения.

Существует способ выбора строк на основе столбцов, которые не являются частью первичного ключа, путем создания вторичного индекса. Позвольте мне объяснить это на примере.

В этой схеме:

CREATE TABLE playerInfo (
    player_id int,
    name varchar,
    country varchar,
    age int,
    performance int,
    PRIMARY KEY ((player_id, name), country)
);

первая часть первичного ключа, т.е. player_id и name, является ключом раздела. Это хеш-значение будет определять, в какой узел кластера кассандры будет записан этот ряд.

Следовательно, нам нужно указать оба этих значения в предложении where для извлечения записи. Например

SELECT * FROM playerinfo WHERE player_id = 1000 and name = 'Mark B';

 player_id | name   | country | age | performance
-----------+--------+---------+-----+-------------
      1000 | Mark B |     USA |  26 |           8

Если вторая часть вашего первичного ключа содержит более 2 столбцов, вам потребуется указать значения для всех столбцов в левой части ключа, включая этот столбец.

В этом примере

PRIMARY KEY ((key, column1), column2, column3, column4, column5)

Для фильтрации на основе столбца 3 необходимо указать значения для "key, column1, column2 and column3", Для фильтрации на основе столбца 5 необходимо разделить значения для "key, column1, column2, column3, column4, and column5",

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

Чтобы создать индекс по столбцу, используйте следующую команду

CREATE INDEX player_age on playerinfo (age) ;

Теперь вы можете фильтровать столбцы по возрасту.

SELECT * FROM playerinfo where age = 26;

 player_id | name    | country | age | performance
-----------+---------+---------+-----+-------------
      2000 | Sarah L |      UK |  26 |          24
      1000 |  Mark B |     USA |  26 |           8

Будьте очень осторожны с использованием индекса в Кассандре. Используйте это, только если в таблице есть несколько записей или, точнее, несколько разных значений в этих столбцах.

Также вы можете удалить индекс, используя

DROP INDEX player_age ;

Обратитесь к http://wiki.apache.org/cassandra/SecondaryIndexes и http://www.datastax.com/docs/1.1/ddl/indexes для получения дополнительной информации.

Другие вопросы по тегам