Opérations de base¶
Objectifs
Dans cette section, une partie du langage CQL (Cassandra Query Language) sera explorée. CQL est assez proche du langage SQL. Nous examinons les commandes CQL qui permettent de :
- Créer une BD Cassandra
- Insérer et supprimer des données
- Modifier les données
Objets Cassandra¶
CQL permet d'organiser les données en :
- Keyspace : C'est l'équivalent de Bases de Données. Il définit comment les données sont répliquées dans le cluster.
- Table : Une table décrit le schéma des données qui sont réparties en partitions. Ces dernières contiennent des lignes formées de colonnes. Les schémas des tables sont flexibles.
- Partition : C'est la première partie de la clé primaire qui détermine le noeud sur lequel une ligne est stockée.
- Row : Une collection de colonnes identifiée par une clé primaire unique composé de clé de partitonnement et une clé de clustering.
- Column : Donnée élémentaire d'un type défini par le schéma.
Langage de Définition de Données¶
Syntaxe¶
Keyspace
- Création
CREATE KEYSPACE [ IF NOT EXISTS ] keyspace_name WITH options
- Modification
ALTER KEYSPACE [ IF EXISTS ] keyspace_name WITH options
- Suppression
DROP KEYSPACE [ IF EXISTS ] keyspace_name
Table
- Création
CREATE TABLE [ IF NOT EXISTS ] table_name '(' column_definition ( ',' column_definition )* [ ',' PRIMARY KEY '(' primary_key ')' ] ')' [ WITH table_options ] column_definition::= column_name cql_type [ STATIC ] [ PRIMARY KEY] primary_key::= partition_key [ ',' clustering_columns ] partition_key::= column_name | '(' column_name ( ',' column_name )* ')' clustering_columns::= column_name ( ',' column_name )* table_options:=: COMPACT STORAGE [ AND table_options ] | CLUSTERING ORDER BY '(' clustering_order ')' [ AND table_options ] | options clustering_order::= column_name (ASC | DESC) ( ',' column_name (ASC | DESC) )*
- Modification
ALTER TABLE [ IF EXISTS ] table_name alter_table_instruction alter_table_instruction::= ADD [ IF NOT EXISTS ] column_name cql_type ( ',' column_name cql_type )* | DROP [ IF EXISTS ] column_name ( column_name )* | RENAME [ IF EXISTS ] column_name to column_name (AND column_name to column_name)* | WITH option
- Suppression
DROP TABLE [ IF EXISTS ] table_name
Exemples¶
CQLSH
Les exemples suivants sont exécutés à partir du shell CQLSH.
Création d'un Keyspace (BD)
CREATE KEYSPACE IF NOT EXISTS ecole
WITH REPLICATION = {'class':'SimpleStrategy', 'replication_factor':3};
Cette commande crée un Keyspace ecole avec un facteur de réplication égal à 3.
Un avertissement sera affiché quand le nombre de noeuds est inférieur au facteur de réplication.
Sélectionner le Keyspace
USE ecole;
Vérifier l'invite du shell qui devient
cqlsh:ecole>
Créer les tables
Nous pouvons maintenant créer les tables (ou Column Family sous Cassandra) Cours et Enseignant à partir de notre schéma ecole :
- Cours(idCours, Intitule, Responsable, Niveau, nbHeuresMax, Coeff)
- Enseignant(idEnseignant, Nom, Prenom, statut)
La requête de création de la table Cours :
CREATE TABLE Cours(
idCours INT,
Intitule VARCHAR,
Responsable INT,
Niveau VARCHAR,
nbHeuresMax INT,
Coeff INT,
PRIMARY KEY (idCours)
);
La requête de création de la table Enseignant :
CREATE TABLE Enseignant(
idEnseignant INT,
Nom VARCHAR,
Prenom VARCHAR,
PRIMARY KEY (idEnseignant)
);
DESCRIBE ecole;
Un exemple de résultat est donné ci-dessous :
CREATE KEYSPACE ecole WITH replication = {'class': 'SimpleStrategy', 'replication_factor': '3'} AND durable_writes = true;
CREATE TABLE ecole.cours (
idcours int PRIMARY KEY,
coeff int,
intitule text,
nbheuresmax int,
niveau text,
responsable int
) WITH additional_write_policy = '99p'
AND bloom_filter_fp_chance = 0.01
AND caching = {'keys': 'ALL', 'rows_per_partition': 'NONE'}
AND cdc = false
AND comment = ''
AND compaction = {'class': 'org.apache.cassandra.db.compaction.SizeTieredCompactionStrategy', 'max_threshold': '32', 'min_threshold': '4'}
AND compression = {'chunk_length_in_kb': '16', 'class': 'org.apache.cassandra.io.compress.LZ4Compressor'}
AND crc_check_chance = 1.0
AND default_time_to_live = 0
AND extensions = {}
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 = 'BLOCKING'
AND speculative_retry = '99p';
CREATE TABLE ecole.enseignant (
idenseignant int PRIMARY KEY,
nom text,
prenom text
) WITH additional_write_policy = '99p'
AND bloom_filter_fp_chance = 0.01
AND caching = {'keys': 'ALL', 'rows_per_partition': 'NONE'}
AND cdc = false
AND comment = ''
AND compaction = {'class': 'org.apache.cassandra.db.compaction.SizeTieredCompactionStrategy', 'max_threshold': '32', 'min_threshold': '4'}
AND compression = {'chunk_length_in_kb': '16', 'class': 'org.apache.cassandra.io.compress.LZ4Compressor'}
AND crc_check_chance = 1.0
AND default_time_to_live = 0
AND extensions = {}
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 = 'BLOCKING'
AND speculative_retry = '99p';
Ajouter une colonne
Nous avons oublier de définir la colonne Statut. Pour l'ajouter, écrire la commande suivante :
ALTER TABLE Enseignant ADD Statut VARCHAR;
Puis vérifier avec :
DESC Enseignant;
Créer un index
Afin de permettre la recherche par enseignant responsable dans la table Cours, nous ajoutons un index sur la colonne Responsable :
CREATE INDEX idx_Responsable ON Cours(Responsable);
FOREIGN KEY
Cassandra ne supporte pas les clés étrangères.
Langage de Manipulation de Données¶
Syntaxe¶
- Insertion
INSERT INTO table_name ( names_values | json_clause ) [ IF NOT EXISTS ] [ USING update_parameter ( AND update_parameter )* ] names_values::= names VALUES tuple_literal json_clause::= JSON string [ DEFAULT ( NULL | UNSET ) ] names::= '(' column_name ( ',' column_name )* ')'
- Modification
UPDATE table_name [ USING update_parameter ( AND update_parameter )* ] SET assignment( ',' assignment )* WHERE where_clause [ IF ( EXISTS | condition ( AND condition)*) ] update_parameter ::= ( TIMESTAMP | TTL ) ( integer | bind_marker ) assignment: simple_selection'=' term | column_name'=' column_name ( '+' | '-' ) term | column_name'=' list_literal'+' column_name simple_selection ::= column_name | column_name '[' term']' | column_name'.' field_name condition ::= simple_selection operator term
- Suppression
DELETE [ simple_selection ( ',' simple_selection ) ] FROM table_name [ USING update_parameter ( AND update_parameter# )* ] WHERE where_clause [ IF ( EXISTS | condition ( AND condition)*) ]
Exemples¶
Insertion des données
INSERT INTO Cours (idCours,Intitule,Responsable,Niveau,nbHeuresMax,Coeff)
VALUES (1,'Introduction aux Bases de Donnees',1,'M1',30,3);
INSERT INTO Cours (idCours,Intitule,Responsable,Niveau,nbHeuresMax,Coeff)
VALUES (2,'Immeubles de Grandes Hauteurs',4,'M1',30,2);
INSERT INTO Cours (idCours,Intitule,Responsable,Niveau,nbHeuresMax,Coeff)
VALUES (3,'Production et distribution de biens et de ser',5,'M1',30,2);
INSERT INTO Cours (idCours,Intitule,Responsable,Niveau,nbHeuresMax,Coeff)
VALUES (4,'Bases de Donnees Avancees',1,'M2',30,5);
INSERT INTO Cours (idCours,Intitule,Responsable,Niveau,nbHeuresMax,Coeff)
VALUES (5,'Architecture des Systemes Materiel',6,'M2',8,1);
INSERT INTO Cours (idCours,Intitule,Responsable,Niveau,nbHeuresMax,Coeff)
VALUES (6,'IT Business / Introduction',7,'M2',20,3);
INSERT INTO Cours (idCours,Intitule,Responsable,Niveau,nbHeuresMax,Coeff)
VALUES (7,'IT Business / Strategie et Management',8,'M2',10,1);
INSERT INTO Enseignant (idEnseignant,Nom,Prenom,statut) VALUES (1,'Travers','Nicolas','Vacataire');
INSERT INTO Enseignant (idEnseignant,Nom,Prenom,statut) VALUES (2,'Mourier','Pascale','Titulaire');
INSERT INTO Enseignant (idEnseignant,Nom,Prenom,statut) VALUES (3,'Boisson','Francois','Vacataire');
INSERT INTO Enseignant (idEnseignant,Nom,Prenom,statut) VALUES (4,'Mathieu','Eric','Titulaire');
INSERT INTO Enseignant (idEnseignant,Nom,Prenom,statut) VALUES (5,'Chu','Chengbin','Titulaire');
INSERT INTO Enseignant (idEnseignant,Nom,Prenom,statut) VALUES (6,'Boutin','Philippe','Titulaire');
INSERT INTO Enseignant (idEnseignant,Nom,Prenom,statut) VALUES (7,'Escribe','Julien','Vacataire');
INSERT INTO Enseignant (idEnseignant,Nom,Prenom,statut) VALUES (8,'Znaty','David','Vacataire');
INSERT INTO Enseignant (idEnseignant,Nom,Prenom,statut) VALUES (9,'Abal-Kassim','Cheik Ahamed','Vacataire');
Vérifier, par exemple, le contenu de la table enseignant :
SELECT * FROM Enseignant;
Mise à jour
UPDATE Cours Set nbheuresmax = 10 WHERE idCours = 5;
Modifier le nombre d'heures Max pour le cours 5.
Suppression
DELETE FROM Cours WHERE idCours in (1,3,5);
Supprimer les cours de codes 1, 3 et 5.