Руководство по Cassandra. Работа с данными.

В данной статье мы рассмотрим работу с данными (основные CRUD операции) в Apache Cassandra.

Вставка данных

В прошлой статье мы удалили нашу таблицу, поэтому начнём с создания новой.

Для этого выполним команду:



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

Проверяем:

DESCRIBE TABLES ;

В результате видим в консоли следующее:

cqlsh:proselyte> DESCRIBE TABLES ;

developers

Для создания записи используется команда следующего вида:


INSERT INTO <ИМЯ_ТАБЛИЦЫ>
(<ИМЯ_КОЛОНКИ_1>, <ИМЯ_КОЛОНКИ_1>....)
VALUES (<ЗНАЧЕНИЕ_1>, <ЗНАЧЕНИЕ_1>....)
USING <ОПЦИИ>

Рассмотрим такой пример. Выполним поочередно следующие команды:

INSERT INTO developers (developer_id , first_name , last_name , salary , specialty ) VALUES ( 1, 'Eugene', 'Suleimanov', 5000, 'Software Engineer/Tech Lead') ;


INSERT INTO developers (developer_id , first_name , last_name , salary , specialty ) VALUES ( 2, 'Ivan', 'Ivanov', 4000, 'Software Engineer') ;


INSERT INTO developers (developer_id , first_name , last_name , salary , specialty ) VALUES ( 3, 'Sergey', 'Sergeev', 3000, 'QA') ;

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


SELECT * FROM <ИМЯ_ТАБЛИЦЫ>

Проверим, какие данные хранятся в таблице developers:

SELECT * FROM developers ;

В результате мы получим следующий вывод в консоль:

cqlsh:proselyte> SELECT * FROM developers ;

developer_id | first_name | last_name | salary | specialty
————–+————+————+——–+—————————–
1 | Eugene | Suleimanov | 5000 | Software Engineer/Tech Lead
2 | Ivan | Ivanov | 4000 | Software Engineer
3 | Sergey | Sergeev | 3000 | QA

(3 rows)

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

SELECT <ИМЯ_КОЛОНКИ_1>, <ИМЯ_КОЛОНКИ_2>, <ИМЯ_КОЛОНКИ_3> FROM <ИМЯ_ТАБЛИЦЫ>

Попробуем выполнить следующую команду:

SELECT first_name, last_name, specialty FROM developers ;

Результатом выполнения данной команды будет следующий вывод в консоль:

cqlsh:proselyte> SELECT first_name, last_name, specialty FROM developers ;

first_name | last_name | specialty
————+————+—————————–
Eugene | Suleimanov | Software Engineer/Tech Lead
Ivan | Ivanov | Software Engineer
Sergey | Sergeev | QA

(3 rows)

Также, мы имеем возможность задавать условия поиска.
Общий вид команды:

SELECT FROM

WHERE <УСЛОВИЕ>;

Например:

SELECT * FROM developers WHERE developer_id = 1 ;

Результат:

developer_id | first_name | last_name | salary | specialty
--------------+------------+------------+--------+-----------------------------
1 | Eugene | Suleimanov | 5000 | Software Engineer/Tech Lead

(1 rows)

Важный момент, если мы попытаемся выполнить команду:

SELECT * FROM developers WHERE salary > 3500 ;

Мы получим ошибку:

InvalidRequest: Error from server: code=2200 [Invalid query] message="Cannot execute this query as it might involve data filtering and thus may have unpredictable performance. If you want to execute this query despite the performance unpredictability, use ALLOW FILTERING"

Т.е. Cassandra говорит, что поиск не по ключу – может ухудшить производительность. Если мы хотим выполнить подобный запрос, на основании колонки, которая не является ключом, то команда должна быть следующей:


SELECT * FROM developers WHERE salary > 3500 ALLOW FILTERING ;

Результат выполнения запроса:

cqlsh:proselyte> SELECT * FROM developers WHERE salary > 3500 ALLOW FILTERING ;

developer_id | first_name | last_name | salary | specialty
————–+————+————+——–+—————————–
1 | Eugene | Suleimanov | 5000 | Software Engineer/Tech Lead
2 | Ivan | Ivanov | 4000 | Software Engineer

(2 rows)

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

UPDATE <ИМЯ_ТАБЛИЦЫ>
SET <ИМЯ_КОЛОНКИ> = <ЗНАЧЕНИЕ>
<ИМЯ_КОЛОНКИ> = <ЗНАЧЕНИЕ>....
WHERE <УСЛОВИЕ>

Рассмотрим пример на нашей таблице developers. “Повысим” зарплату разработчику с id 3 с 3000 до 3500.

Смотрим текущие данные:

SELECT * FROM developers WHERE developer_id = 3;

Результат:

developer_id | first_name | last_name | salary | specialty
--------------+------------+-----------+--------+-----------
3 | Sergey | Sergeev | 3000 | QA

(1 rows)

 

Изменяем данные:

UPDATE developers SET salary = 3500 WHERE developer_id = 3 ;

Проверяем:
Смотрим текущие данные:

SELECT * FROM developers WHERE developer_id = 3;

Результат:

cqlsh:proselyte> SELECT * FROM developers WHERE developer_id = 3;

developer_id | first_name | last_name | salary | specialty
————–+————+———–+——–+———–
3 | Sergey | Sergeev | 3500 | QA

(1 rows)

Удаление данных
Для удаления записи (записей) из таблицы используется команды следующего вида:

DELETE FROM <ИМЯ_ТАБЛИЦЫ> WHERE <УСЛОВИЕ>;

Попробуем удалить разработчика с developer_id 2. Проверяем таблицу:

cqlsh:proselyte> SELECT * FROM developers ;

developer_id | first_name | last_name | salary | specialty
————–+————+————+——–+—————————–
1 | Eugene | Suleimanov | 5000 | Software Engineer/Tech Lead
2 | Ivan | Ivanov | 4000 | Software Engineer
3 | Sergey | Sergeev | 3500 | QA

(3 rows)

 

Удаляем данные:

DELETE FROM developers WHERE developer_id = 2;

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

cqlsh:proselyte> SELECT * FROM developers ;

developer_id | first_name | last_name | salary | specialty
————–+————+————+——–+—————————–
1 | Eugene | Suleimanov | 5000 | Software Engineer/Tech Lead
3 | Sergey | Sergeev | 3500 | QA

(2 rows)

 

Как видите, данные о разработчике с developer_id = 2 исчезли из таблицы.

Обработка пакетов данных
В Cassandra также предусмотрена пакетная обработка запросов. Т.е. мы можем выполнить несколько запросов “одновременно”.

Общий вид данной команды следующий:

BEGIN BATCH
<ЗАПИСЬ> ... <ИЗМЕНЕНИЕ> <ИЗМЕНЕНИЕ> ... <ЗАПИСЬ> <УДАЛЕНИЕ>
APPLY BATCH

На данный момент наша таблица имеет следующий вид:

cqlsh:proselyte> SELECT * FROM developers ;

developer_id | first_name | last_name | salary | specialty
————–+————+————+——–+—————————–
1 | Eugene | Suleimanov | 5000 | Software Engineer/Tech Lead
3 | Sergey | Sergeev | 3500 | QA

(2 rows)

Рассмотрим следующий пример:

BEGIN BATCH
INSERT INTO developers (developer_id , first_name , last_name , salary , specialty )
VALUES ( 4, 'Kirill', 'Kirilov', 3300, 'Software Engineer');
UPDATE developers SET salary = 6000 WHERE developer_id = 1;
DELETE FROM developers WHERE developer_id = 3;
APPLY BATCH ;

 


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

developer_id | first_name | last_name | salary | specialty
--------------+------------+------------+--------+-----------------------------
1 | Eugene | Suleimanov | 6000 | Software Engineer/Tech Lead
4 | Kirill | Kirilov | 3300 | Software Engineer

(2 rows)

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

Полная очистка таблицы
И рассмотрим полную очистку таблицы. Общий вид команды:

TRUNCATE <ИМЯ_ТАБЛИЦЫ>

На данный момент наша таблица имеет следующий вид:

developer_id | first_name | last_name | salary | specialty
--------------+------------+------------+--------+-----------------------------
1 | Eugene | Suleimanov | 6000 | Software Engineer/Tech Lead
4 | Kirill | Kirilov | 3300 | Software Engineer

(2 rows)

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

TRUNCATE developers ;

И выполняем запрос:

SELECT * FROM developers ;

Результат:

cqlsh:proselyte> SELECT * FROM developers ;

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

(0 rows)

На этом мы заканчиваем обзор работы с таблицами в Apache Cassanrda. В следующей статье мы рассмотрим типы данных в данной БД.