Руководство по Cassandra. СQL коллекции.

В данной статье мы рассмотрим работу с коллекциями в Apache Cassandra.

Коллекции позволяют нам хранить много значений в одной переменной.

В Cassandra есть 3 коллекции:

  • List
  • Set
  • Map

Рассмотрим каждый из них отдельно.

List

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

Попробуем добавить коллекцию в нашу таблицу developers:

ALTER TABLE developers ADD skills list;

Проверим таблицу:

DESCRIBE TABLE developers ;

Результат:

cqlsh:proselyte> DESCRIBE TABLE developers

CREATE TABLE proselyte.developers (
developer_id int PRIMARY KEY,
first_name text,
last_name text,
salary varint,
skills list,
specialty 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’, ‘max_threshold’: ’32’, ‘min_threshold’: ‘4’}
AND compression = {‘chunk_length_in_kb’: ’64’, ‘class’: ‘org.apache.cassandra.io.compress.LZ4Compressor’}
AND crc_check_chance = 1.0
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 = ’99PERCENTILE’;
CREATE INDEX last_name_index ON proselyte.developers (last_name);


В данном случае, нас интересует поле:

skills list,

Вставим значение в нашу таблицу, на данный момент, она пуста:

cqlsh:proselyte> SELECT * FROM developers ;

developer_id | first_name | last_name | salary | skills | specialty
————–+————+———–+——–+——–+———–


(0 rows)

Выполним команду:

INSERT INTO developers (developer_id , first_name , last_name , specialty , salary , skills ) VALUES ( 1, 'Eugene', 'Suleimanov', 'Software Engineer', 5000, ['Java', 'Spring', 'Python', 'Hibernate', 'Java']);

Проверяем нашу таблицу:

cqlsh:proselyte> SELECT * FROM developers ;

developer_id | first_name | last_name | salary | skills | specialty
————–+————+————+——–+—————————————————+——————-
1 | Eugene | Suleimanov | 5000 | [‘Java’, ‘Spring’, ‘Python’, ‘Hibernate’, ‘Java’] | Software Engineer


Как мы можем видеть, в поле skills – Java повторяется 2 раза и порядок добавления элементов сохранён.

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

UPDATE developers SET skills = skills + ['RxJava'] WHERE developer_id = 1;

И снова проверяем наши данные в таблице developers:

cqlsh:proselyte> SELECT * FROM developers;

developer_id | first_name | last_name | salary | skills | specialty
————–+————+————+——–+————————————————————-+——————-
1 | Eugene | Suleimanov | 5000 | [‘Java’, ‘Spring’, ‘Python’, ‘Hibernate’, ‘Java’, ‘RxJava’] | Software Engineer


(1 rows)

В коллекцию было добавлено значение RxJava.

Set
Рассмотрим работу с Set.
Пересоздадим нашу таблицу developers:


DROP TABLE developers ;


CREATE TABLE proselyte.developers (
developer_id int PRIMARY KEY,
first_name text,
last_name text,
salary varint,
specialty text,
skills set
);

Выполним команду:

SELECT * FROM developers ;

Результат:

cqlsh:proselyte> SELECT * FROM developers ;

developer_id | first_name | last_name | salary | skills | specialty
————–+————+———–+——–+——–+———–


(0 rows)

Добавим запись:


INSERT INTO developers (developer_id, first_name, last_name, specialty, salary, skills) VALUES (1, ‘Eugene’, ‘Suleimanov’, ‘Software Engineer’, 5000, {‘Java’, ‘Spring’, ‘Python’, ‘Hibernate’, ‘Java’});


Проверяем:
cqlsh:proselyte> SELECT * FROM developers ;

developer_id | first_name | last_name | salary | skills | specialty
————–+————+————+——–+——————————————-+——————-
1 | Eugene | Suleimanov | 5000 | {‘Hibernate’, ‘Java’, ‘Python’, ‘Spring’} | Software Engineer


(1 rows)

Несмотря на то, что мы пытались добавить Java 2 раза в skills, здесь мы видим только 1 слово Java, и данные упорядочены по возрастанию.

Для изменения данных, выполним следующую команду:

UPDATE developers SET skills = skills + {'RxJava'} WHERE developer_id = 1;

И проверим нашу таблицу:

cqlsh:proselyte> SELECT * FROM developers ;

developer_id | first_name | last_name | salary | skills | specialty
————–+————+————+——–+—————————————————–+——————-
1 | Eugene | Suleimanov | 5000 | {‘Hibernate’, ‘Java’, ‘Python’, ‘RxJava’, ‘Spring’} | Software Engineer


(1 rows)

Map

Как уже было сказано выше – Map позволяет нам хранить пары ключ-значение.
Рассмотрим пример. Создадим новую колонку в таблице developer:


ALTER TABLE developers ADD messages map<timestamp, text="">;
</timestamp,>

Теперь наша таблица имеет следующий вид:

cqlsh:proselyte> SELECT * FROM developers ;

developer_id | first_name | last_name | messages | salary | skills | specialty
————–+————+————+———-+——–+—————————————————–+——————-
1 | Eugene | Suleimanov | null | 5000 | {‘Hibernate’, ‘Java’, ‘Python’, ‘RxJava’, ‘Spring’} | Software Engineer

(1 rows)



Добавим пару значений:

UPDATE developers SET messages = {'1563021915': 'MESSAGE_1', '1563021916': 'MESSAGE_2'} WHERE developer_id = 1;

И выполним SELECT запрос:

cqlsh:proselyte> SELECT last_name, messages FROM developers ;

last_name | messages
————+————————————————————————————————–
Suleimanov | {‘1970-01-19 02:10:21.915000+0000’: ‘MESSAGE_1’, ‘1970-01-19 02:10:21.916000+0000’: ‘MESSAGE_2’}


(1 rows)

На этом мы заканчиваем обзор коллекций и в целом, руководство по Apache Cassandra.