Laboratorul 12 - Cassandra

Obiective

  • Comenzi Cassandra
  • Operatii DML
  • Tipuri colectie
  • Tipuri definite de utilizator

Instalare

Pentru a utiliza Cassandra folosind Docker:

  1. Descarcati imaginea Docker:
    docker pull cassandra
  2. Porniti un container bazat pe imaginea descarcata:
    docker run --name cassandradb -d cassandra:latest

Comenzi Cassandra

Conexiune la Cassandra

Pentru a ne conecta la un server Cassandra putem folosi utilitarul cqlsh (Documentație).

Printre parametrii pe care cqlsh ii permite avem:

  • --user - specifica utilizatorul cu care sa se conecteze la Cassandra
  • --password - specifica parola utilizatorului
  • --keyspace - precizeaza keyspace-ul la care sa se conecteze
  • --file - specifica un fisier din care sa se execute comenzi, urmate de exit

Deschideti o conexiune la Cassandra ruland comanda:

docker exec -it cassandradb cqlsh

Comenzi CLI Cassandra

Cateva dintre comenzile ce tin de administrarea keyspace-urilor sunt:

-- listare keyspace-uri disponibile
DESCRIBE KEYSPACES;
 
-- afisare keyspace curent
DESCRIBE KEYSPACE;
 
-- conectare la un keyspace existent
USE <keyspace_name>;
 
-- creare keyspace nou
CREATE KEYSPACE <keyspace_name> WITH replication = {'class': 'SimpleStrategy', 'replication_factor': 3 };
 
-- creare keyspace nou fara a scrie operatiile si in commit log
CREATE KEYSPACE <keyspace_name> WITH replication = {'class': 'SimpleStrategy', 'replication_factor': 3 } AND durable_writes = TRUE;
 
-- stergere keyspace
DROP KEYSPACE <keyspace_name>;

Ex. 1. Creati un keyspace cu numele students_keyspace cu durable_writes setat pe true si conectati-va la el.

Pentru a crea un tabel in keyspace-ul curent:

CREATE TABLE <table_name> (
   <column_name1> datatype PRIMARY KEY,
   <column_name2> datatype,
   <column_name3> datatype,
   ...
)

Pentru a sterge un tabel in keyspace-ul curent:

DROP TABLE <table_name>

Ex. 2. Creati o tabela cu numele students care are coloanele: id de tip INT ca PRIMARY KEY, firstname de tip VARCHAR, lastname de tip VARCHAR, year de tip INT, group de tip VARCHAR.

Operatii DML

Inserarea datelor

Pentru a insera date in Cassandra se poate folosi comanda INSERT, asemanator limbajului SQL:

INSERT INTO <table_name> (<column_name1>, <column_name2>....)
VALUES (<value1>, <value2>....);

Inserati in tabela students urmatorii studenti:

INSERT INTO students (id, firstname, lastname, YEAR, GROUP) VALUES (1, 'Ion', 'Popescu', 4, '342C3');
INSERT INTO students (id, firstname, lastname, YEAR, GROUP) VALUES (2, 'Andrei', 'Ionescu', 4, '341C4');
INSERT INTO students (id, firstname, lastname, YEAR, GROUP) VALUES (3, 'George', 'Popescu', 4, '341C2');
INSERT INTO students (id, firstname, lastname, YEAR, GROUP) VALUES (4, 'Georgiana', 'Petrescu', 4, '341C2');
INSERT INTO students (id, firstname, lastname, YEAR, GROUP) VALUES (5, 'Valentina', 'Vasilescu', 3, '331CA');
INSERT INTO students (id, firstname, lastname, YEAR, GROUP) VALUES (6, 'Grigore', 'Ionescu', 4, '342C2');
INSERT INTO students (id, firstname, lastname, YEAR, GROUP) VALUES (7, 'Andrei', 'Popescu', 3, '332CA');
INSERT INTO students (id, firstname, lastname, YEAR, GROUP) VALUES (8, 'Ana', 'Georgescu', 4, '342C5');

Ex. 3. Inserati in tabela students 2 colegi.

Selectarea datelor

Operatia de selectie a datelor in Cassandra se poate realiza prin comanda SELECT:

SELECT * | select_expression 
FROM [keyspace_name.] <table_name>
[WHERE filters] 
[ORDER BY column_name1, column_name2... ASC|DESC] 
[LIMIT N]
[ALLOW FILTERING];

Pentru a putea impune conditii de filtrare pe coloane care nu sunt indexate trebuie precizat explicit ALLOW FILTERING.

Limitari ale comenzii SELECT:

  • Nu se pot folosi subcereri.
  • Unii operatori nu sunt acceptati. Ex.: BETWEEN
  • Unii operatori functioneaza doar pe chei primare. Ex.: IN
  • Nu exista operatia JOIN.

Ex. 4. Selectati toti studentii de anul 4 care au prenumele 'Andrei'.

Modificarea datelor

Pentru a modifica datele in Cassandra se foloseste comanda UPDATE:

UPDATE [keyspace_name.] <table_name>
SET assignment [, assignment] . . . 
WHERE row_specification

Clauza WHERE poate contine numai conditii ce tin de chei primare.

Ex. 5. Promovati toti studentii din tabela students de anul 3 in anul 4, prin actualizarea coloanei year si group.

Stergerea datelor

Pentru a sterge datele in Cassandra se poate folosi comanda DELETE:

DELETE [column_name (term)][, ...]
FROM [keyspace_name.] <table_name>
WHERE PK_column_conditions;

Clauza WHERE poate contine numai conditii ce tin de chei primare.

Alternativ, se poate folosi comanda TRUNCATE pentru a sterge toate valorile dintr-un tabel:

TRUNCATE [TABLE] [keyspace_name.] <table_name>

Ex. 6. Stergeti din tabela students studentii cu id-urile 1, 3 si 5.

Tipuri colectie

Tipurile colectie sunt utile in cazurile in care avem nevoie sa stocam un numar variabil de elemente intr-o singura coloana.

Cassandra pune la dispozitie urmatoarele tipuri colectie:

  • Set
  • List
  • Map

Tipul Set

Tipul de date set stocheaza o multime de elemente neordonate, care pot fi de tipuri simple, tipuri definite de utilizator sau alte colectii.

Pentru a adauga o coloana de tip set intr-o tabela putem folosi:

ALTER TABLE <table_name> ADD <column_name> SET<data_type>;

La interogari, cqlsh intoarce elementele din set sortate.

Un avantaj al utilizarii setului este posibilitatea de a adauga elemente fara a fi nevoiti sa citim continutul setului intai.

Pentru a adauga un nou element in set se foloseste +:

my_set = my_set + { new_element }

Pentru a sterge un element din set se foloseste -:

my_set = my_set - { old_element }

Pentru a seta un set gol se foloseste {}:

my_set = {}

Adaugati la tabela students coloana hobbies de tipul SET<TEXT>:

ALTER TABLE students ADD hobbies SET<TEXT>;

Apoi populati coloana hobbies pentru studentii predefiniti:

UPDATE students SET hobbies = {'Tennis', 'Chess'} WHERE id = 2;
UPDATE students SET hobbies = {'Programming', 'Design'} WHERE id = 4;
UPDATE students SET hobbies = {'Table Tennis', 'Backgammon'} WHERE id = 6;
UPDATE students SET hobbies = {'Football'} WHERE id = 7;
UPDATE students SET hobbies = {'Swimming'} WHERE id = 8;

Ex. 7. Adaugati hobby-uri pentru studentii inserati in tabela students la exercitiul 3.

Tipul List

Tipul de date list contine o lista de elemente ordonate. In mod standard, ele sunt ordonate dupa ordinea de inserare.

Pentru a adauga o coloana de tipul list putem folosi:

ALTER TABLE <table_name> ADD <column_name> LIST<data_type>;

Pentru a adauga un element in lista se poate folosi +:

my_list = my_list + [ new_element ]

Pentru a sterge un element din lista se poate folosi -:

my_list = my_list - [ old_element ]

Pentru a seta o lista goala se poate folosi []:

my_list = []

Se pot folosi indecsi pentru a accesa elemente specifice in lista folosind [index_number], indexarea pornind de la 0.

Adaugati o coloana de tip lista in tabela students, cu numele languages si tipul LIST<TEXT>:

ALTER TABLE students ADD languages LIST<TEXT>;

Apoi populati coloana languages pentru studentii predefiniti:

UPDATE students SET languages = ['C', 'C++'] WHERE id = 2;
UPDATE students SET languages = ['Java', 'Scala'] WHERE id = 4;
UPDATE students SET languages = ['Python', 'Go'] WHERE id = 6;
UPDATE students SET languages = ['Ruby'] WHERE id = 7;
UPDATE students SET languages = ['PHP', 'Javascript'] WHERE id = 8;

Ex. 8. Adaugati limbajul C# pentru studentul cu id-ul 2 la lista de limbaje de programare cunoscute si goliti lista de limbaje de programare cunoscute pentru studentul cu id-ul 8.

Tipul Map

Tipul de date map contine o multime de perechi cheie-valoare. Cheile si valorile pot avea orice tip cu exceptia counter.

Pentru a adauga o coloana de tip map intr-o tabela putem folosi:

ALTER TABLE <table_name> ADD <column_name> MAP<data_type_key, data_type_value>;

Cheile map-ului pot fi accesate folosind [key_name]:

my_map[my_key] = my_value

Pentru a verifica daca un map contine o valoare putem folosi CONTAINS:

SELECT * FROM my_table WHERE map_column CONTAINS map_value ALLOW FILTERING;

Pentru a verifica daca un map contine o cheie putem folosi CONTAINS KEY:

SELECT * FROM my_table WHERE map_column CONTAINS KEY map_key ALLOW FILTERING;

Adaugati la tabela students coloana grades de tipul MAP<TEXT, DOUBLE>:

ALTER TABLE students ADD grades MAP<TEXT, DOUBLE>;

Apoi adaugati note la studentii predefiniti:

UPDATE students SET grades = {'Baze de date 2': 10, 'Utilizarea sistemelor de operare': 8} WHERE id = 2;
UPDATE students SET grades = {'Programare web': 9, 'Calculatoare numerice': 8} WHERE id = 4;
UPDATE students SET grades = {'Baze de date 2': 9} WHERE id = 6;
UPDATE students SET grades = {'Matematica 1': 8, 'Matematica 2': 9} WHERE id = 7;
UPDATE students SET grades = {'Metode numerice': 10, 'Baze de date 2': 7} WHERE id = 8;

Ex. 9. Selectati studentii care au note la materia 'Baze de date 2'.

Tipuri definite de utilizator

Cassandra suporta si tipuri definite de utilizator (User defined types - UDT). Acestea pot fi folosite atat de sine statator, cat si in colectii.

La utilizarea unui UDT intr-o colectie, acesta trebuie declarat ca frozen, ceea ce inseamna ca modificarea valorii nu se poate face accesand individual campurile UDT-ului, ci doar modificata ca intreg obiect.

Pentru a defini un UDT se poate folosi:

CREATE TYPE [IF NOT EXISTS] 
[keyspace_name.] <type_name>(
<field_name> data_type[,] 
[<field_name> data_type] [,...]
)

Pentru a adauga o coloana de tip UDT se poate folosi:

-- coloana UDT non-colectie
ALTER TABLE <table_name> ADD <column_name> udt_data_type;
 
-- coloana UDT colectie
ALTER TABLE <table_name> ADD <column_name> collection<frozen<udt_data_type>>;

Pentru a seta o valoare de tip UDT se poate folosi:

my_udt_column = {field_1: value_1, field_2: value_2, ...}

Definiti tipul nou Course care are campurile name de tip VARCHAR si year de tip INT:

CREATE TYPE course(
  name VARCHAR,
  YEAR INT
);

Adaugati in tabela students coloana classes cu tipul LIST<FROZEN<COURSE»:

ALTER TABLE students ADD classes LIST<FROZEN<COURSE>>;

Apoi adaugati cursuri studentilor predefiniti:

UPDATE students SET classes = [{name: 'Baze de date 2', YEAR: 4}, {name: 'Utilizarea sistemelor de operare', YEAR: 1}] WHERE id = 2;
UPDATE students SET classes = [{name: 'Programare web', YEAR: 4}, {name: 'Calculatoare numerice', YEAR: 2}] WHERE id = 4;
UPDATE students SET classes = [{name: 'Baze de date 2', YEAR: 4}] WHERE id = 6;
UPDATE students SET classes = [{name: 'Matematica 1', YEAR: 1}, {name: 'Matematica 2', YEAR: 1}] WHERE id = 7;
UPDATE students SET classes = [{name: 'Metode numerice', YEAR: 1}, {name: 'Baze de date 2', YEAR: 4}] WHERE id = 8;

Ex. 10. Adaugati cate 2 cursuri studentilor inserati in tabela students la exercitiul 3.

bd2/laboratoare/13.txt · Last modified: 2021/01/20 17:33 by vlad_iulian.ilie
CC Attribution-Share Alike 3.0 Unported
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0