This shows you the differences between two versions of the page.
bd2:laboratoare:13 [2021/01/17 23:35] vlad_iulian.ilie [Tipuri definite de utilizator] |
— (current) | ||
---|---|---|---|
Line 1: | Line 1: | ||
- | ====== Laboratorul 12 - Cassandra ====== | ||
- | |||
- | ===== Obiective ===== | ||
- | |||
- | |||
- | ===== Instalare ===== | ||
- | |||
- | Pentru a utiliza Cassandra folosind Docker: | ||
- | |||
- | - Descarcati imaginea Docker: <code>docker pull cassandra</code> | ||
- | - Porniti un container bazat pe imaginea descarcata: <code>docker run --name cassandradb -d cassandra:latest</code> | ||
- | ===== Comenzi Cassandra ===== | ||
- | |||
- | ==== Conexiune la Cassandra ==== | ||
- | |||
- | Pentru a ne conecta la un server Cassandra putem folosi utilitarul **cqlsh** ([[https://cassandra.apache.org/doc/latest/tools/cqlsh.html|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: <code>docker exec -it cassandradb cqlsh</code> | ||
- | |||
- | ==== Comenzi CLI Cassandra ==== | ||
- | |||
- | Cateva dintre comenzile ce tin de administrarea **keyspace-urilor** sunt: | ||
- | |||
- | <code sql> | ||
- | -- listare keyspace-uri disponibile | ||
- | DESCRIBE KESPACES; | ||
- | |||
- | -- 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 | ||
- | DELETE KEYSPACE <keyspace_name>; | ||
- | </code> | ||
- | |||
- | <color red>Ex. 1.</color> 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: | ||
- | |||
- | <code sql> | ||
- | CREATE TABLE <table_name> ( | ||
- | <column_name1> datatype PRIMARYKEY, | ||
- | <column_name2> datatype, | ||
- | <column_name3> datatype, | ||
- | ... | ||
- | ) | ||
- | </code> | ||
- | |||
- | Pentru a sterge un tabel in keyspace-ul curent: | ||
- | |||
- | <code sql>DROP TABLE <table_name></code> | ||
- | |||
- | <color red>Ex. 2.</color> 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: | ||
- | |||
- | <code sql> | ||
- | INSERT INTO <table_name> (<column_name1>, <column_name2>....) | ||
- | VALUES (<value1>, <value2>....); | ||
- | </code> | ||
- | |||
- | Inserati in tabela students urmatorii studenti: | ||
- | |||
- | <code sql> | ||
- | 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'); | ||
- | </code> | ||
- | |||
- | <color red>Ex. 3.</color> Inserati in tabela students 2 colegi. | ||
- | |||
- | ==== Selectarea datelor ==== | ||
- | |||
- | Operatia de selectie a datelor in Cassandra se poate realiza prin comanda **SELECT**: | ||
- | |||
- | <code sql> | ||
- | SELECT * | select_expression | ||
- | FROM [keyspace_name.] <table_name> | ||
- | [WHERE filters] | ||
- | [ORDER BY column_name1, column_name2... ASC|DESC] | ||
- | [LIMIT N] | ||
- | [ALLOW FILTERING]; | ||
- | </code> | ||
- | |||
- | <note> | ||
- | 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. | ||
- | </note> | ||
- | |||
- | <color red>Ex. 4.</color> Selectati toti studentii de anul 4 care au literele //pe// (case insensitive) in nume sau in prenume. | ||
- | ==== Modificarea datelor ==== | ||
- | |||
- | Pentru a modifica datele in Cassandra se foloseste comanda **UPDATE**: | ||
- | |||
- | <code sql> | ||
- | UPDATE [keyspace_name.] <table_name> | ||
- | SET assignment [, assignment] . . . | ||
- | WHERE row_specification | ||
- | </code> | ||
- | |||
- | <color red>Ex. 5.</color> 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**: | ||
- | |||
- | <code sql> | ||
- | DELETE [column_name (term)][, ...] | ||
- | FROM [keyspace_name.] <table_name> | ||
- | WHERE PK_column_conditions; | ||
- | </code> | ||
- | |||
- | <note>Clauza WHERE poate contine numai conditii ce tin de chei primare.</note> | ||
- | |||
- | Alternativ, se poate folosi comanda **TRUNCATE** pentru a sterge toate valorile dintr-un tabel: | ||
- | |||
- | <code sql> | ||
- | TRUNCATE [TABLE] [keyspace_name.] <table_name> | ||
- | </code> | ||
- | |||
- | <color red>Ex. 6.</color> 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: | ||
- | <code sql> | ||
- | ALTER TABLE <table_name> ADD <column_name> SET<data_type>; | ||
- | </code> | ||
- | |||
- | <note> | ||
- | 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. | ||
- | </note> | ||
- | |||
- | <note> | ||
- | Pentru a adauga un nou element in set se foloseste **+**: <code>my_set = my_set + { new_element }</code> | ||
- | |||
- | Pentru a sterge un element din set se foloseste **-**: <code>my_set = my_set - { old_element }</code> | ||
- | |||
- | Pentru a seta un set gol se foloseste **{}**: <code>my_set = {}</code> | ||
- | </note> | ||
- | |||
- | Adaugati la tabela students coloana //hobbies// de tipul SET<TEXT>: | ||
- | <code sql>ALTER TABLE students ADD hobbies SET<TEXT>;</code> | ||
- | |||
- | Apoi populati coloana hobbies pentru studentii predefiniti: | ||
- | <code sql> | ||
- | 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; | ||
- | </code> | ||
- | |||
- | <color red>Ex. 7.</color> 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: | ||
- | <code sql> | ||
- | ALTER TABLE <table_name> ADD <column_name> LIST<data_type>; | ||
- | </code> | ||
- | |||
- | <note> | ||
- | Pentru a adauga un element in lista se poate folosi **+**: <code>my_list = my_list + [ new_element ]</code> | ||
- | Pentru a sterge un element din lista se poate folosi **-**: <code>my_list = my_list - [ old_element ]</code> | ||
- | Pentru a seta o lista goala se poate folosi **[]**: <code>my_list = []</code> | ||
- | </note> | ||
- | |||
- | <note> | ||
- | Se pot folosi indecsi pentru a accesa elemente specifice in lista folosind **[index_number]**, indexarea pornind de la 0. | ||
- | </note> | ||
- | |||
- | Adaugati o coloana de tip lista in tabela students, cu numele //languages// si tipul LIST<TEXT>: | ||
- | <code sql> | ||
- | ALTER TABLE students ADD languages LIST<TEXT>; | ||
- | </code> | ||
- | |||
- | Apoi populati coloana languages pentru studentii predefiniti: | ||
- | <code sql> | ||
- | 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; | ||
- | </code> | ||
- | |||
- | <color red>Ex. 8.</color> 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: | ||
- | <code sql> | ||
- | ALTER TABLE <table_name> ADD <column_name> MAP<data_type_key, data_type_value>; | ||
- | </code> | ||
- | |||
- | <note> | ||
- | Cheile map-ului pot fi accesate folosind **[key_name]**: <code>my_map[my_key] = my_value</code> | ||
- | Pentru a verifica daca un map contine o valoare putem folosi **CONTAINS**: <code sql>SELECT * FROM my_table WHERE map_column CONTAINS map_value ALLOW FILTERING;</code> | ||
- | Pentru a verifica daca un map contine o cheie putem folosi **CONTAINS KEY**: <code sql>SELECT * FROM my_table WHERE map_column CONTAINS KEY map_key ALLOW FILTERING;</code> | ||
- | </note> | ||
- | |||
- | Adaugati la tabela students coloana //grades// de tipul MAP<TEXT, DOUBLE>: | ||
- | <code sql> | ||
- | ALTER TABLE students ADD grades MAP<TEXT, DOUBLE>; | ||
- | </code> | ||
- | |||
- | Apoi adaugati note la studentii predefiniti: | ||
- | <code sql> | ||
- | 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; | ||
- | </code> | ||
- | |||
- | <color red>Ex. 9.</color> Selectati studentii care au note la materia 'Baze de date 2'. | ||
- | |||
- | |||
- | |||
- | |||
- | |||
- | |||
- | ===== Indecsi ===== | ||
- | |||
- | |||
- | ===== 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. | ||
- | |||
- | <note> | ||
- | 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. | ||
- | </note> | ||
- | |||
- | Pentru a defini un UDT se poate folosi: | ||
- | <code sql> | ||
- | CREATE TYPE [IF NOT EXISTS] | ||
- | [keyspace_name.] <type_name>( | ||
- | <field_name> datatype[,] | ||
- | [<field_name> datatype] [,...] | ||
- | ) | ||
- | </code> | ||
- | |||