Aller au contenu

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.

1⃣ 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.

2⃣ Sélectionner le Keyspace

USE ecole;

👁 Vérifier l'invite du shell qui devient cqlsh:ecole>

3⃣ 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)
);
4⃣ Afficher les propriétés du Keyspace

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';

5⃣ 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;

6⃣ 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

1⃣ 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;

2⃣ Mise à jour

UPDATE Cours Set nbheuresmax = 10 WHERE idCours = 5;

💡 Modifier le nombre d'heures Max pour le cours 5.

3⃣ Suppression

DELETE FROM Cours WHERE idCours in (1,3,5);

💡 Supprimer les cours de codes 1, 3 et 5.