В данной статье мы рассмотрим работу с коллекциями в 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.