2014-11-13 2 views
1

Это схема я использую:Выберите конкретную запись в Кассандре с помощью 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) 

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

ответ

3

Вы выбрали первичный ключ как 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'; 

Если вы собираетесь дать где положение о COLUMN2 тогда вам should also need to specify the where clause of key, column1. для, например,

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

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

3

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

В этой схеме:

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

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

Следовательно, мы должны указать оба эти значения в предложении 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 для получения более подробной информации

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