Vous êtes sur la page 1sur 8

TP3- NOSQL O RIENTE

C OLONNES AVEC
C ASSANDRA

Objectifs du TP : Se familiariser avec les bases de données NOSQL,


orientées colonnes, avec Cassandra.
TP4 : NOSQL Orientées Colonnes avec Cassandra

I. Présentation de Cassandra
Cassandra 1 est une base de données NOSQL orientée colonnes, destinée
pour de grands volumes de données, hétérogènes, de structure et taille
évolutives et hautement disponibles, sans compromettre la performance.

Un très large panel d’entreprises, dont Twitter, Netflix et eBay, utilisent


Cassandra. Pour voir la liste complète de ses utilisateurs, visiter:
http://planetcassandra.org/companies/

II. Installer Cassandra


Télécharger la dernière version de Cassandra sur:

http://cassandra.apache.org/download/

Décompresser simplement le fichier que vous venez de télécharger.


Désormais, on appellera le répertoire obtenu après décompression:
<cass_home>.

III. Démarrer Cassandra


Pour commencer:

1. Lancer le serveur Cassandra. (si on omet le –f, il se lancera en arrière


plan)

<cass_home>/bin/cassandra –f
2. Pour arrêter Cassandra, cliquer sur:

Ctrl-C

1 Apache Cassandra : http://cassandra.apache.org/

Page 2
TP4 : NOSQL Orientées Colonnes avec Cassandra

IV. CQL : Cassandra Query Language


CQL est l’interface par défaut dans le SGBD Cassandra. C’est un langage
SQL-Like, pour la manipulation des données dans la base.

Nous citons ci-dessous les commandes de base de CQL. Pour plus de détails,
consulter la documentation officielle.

IV.1. Notions de Base


- Pour se connecter à l’instance locale de CQL

<cass_home>/bin/cqlsh
- Créer un Keyspace :

CREATE KEYSPACE mykeyspace WITH REPLICATION =


{ 'class' : 'SimpleStrategy', 'replication_factor' : 1};
- Afficher l’ensemble des keyspaces:

select * from system.schema_keyspaces;


ou:

describe keyspaces;
- Se connecter au keyspace :

USE mykeyspace;
- Créer une table (il est possible de remplacer le terme TABLE par
COLUMNFAMILY).

CREATE TABLE users (


user_id int PRIMARY KEY,
fname text,
lname text
);
- Afficher les tables existantes:

describe tables;
- Remplir la table:

INSERT INTO users (user_id, fname, lname)


VALUES (1745, 'john', 'smith');

Page 3
TP4 : NOSQL Orientées Colonnes avec Cassandra

- Afficher les données insérées:

SELECT * FROM users;

- Créer un index sur une colonne, puis extraire les données selon cette
colonne :

CREATE INDEX ON users (lname);


SELECT * FROM users WHERE lname = 'smith';

- Créer une table avec une clef composée :

CREATE TABLE tab2 (


id1 int,
id2 int,
first_name varchar,
last_name varchar,
PRIMARY KEY (id1, id2));
- Ajouter un nouveau champ à la table:

ALTER TABLE users ADD telephone text;


- Modifier la valeur d’un enregistrement:

UPDATE users SET telephone = “21212121”


WHERE user_id=1745;

- Vider une table :

TRUNCATE users;
- Supprimer une table :

DROP users;

IV.2. Les Collections


Dans les bases de données relationnelles traditionnelles, il est fortement
déconseillé d’utiliser des valeurs multiples dans un même champs. Pour cela, il
faudrait créer une autre table, et faire une jointure.

Dans les bases NOSQL, le but ultime est de minimiser au maximum les jointures,
pour faciliter et accélerer la navigation. C’est pour cette raison que des
collections comme les sets, listes et maps sont utilisés.

Page 4
TP4 : NOSQL Orientées Colonnes avec Cassandra

Attention à ne pas abuser de ce type de champs: il faut s’assurer que les


collections stockent de petites quantités de données, car une requête
Cassandra lit une collection en entier, c’est à l’utilisateur de les parcourir
ensuite.

IV.2.1. Sets
Un ensemble (set) est un ensemble non ordonné de valeurs. En utlisant le type
de données set, il est possible de résoudre le problème de champs multiples,
comme les emails par exemple.

a. Création

Prenons par exemple le cas d’un ensemble d’emails pour un utilisateur. C’est
représenté par un seul champ, de type set<text>, et est défini dans la table
users comme ceci:

CREATE TABLE users (


user_id int PRIMARY KEY,
fname text,
lname text,
emails set<text>
);
b. Insertion

Pour insérer des données dans l’ensemble, placer les valeurs entre accolades
et les séparer par des virgules. Les différentes valeurs dans un ensemble
doivent être uniques.

INSERT INTO users (user_id, fname, lname, emails)


VALUES(1234, 'Frodo', 'Baggins',
{'f@baggins.com', 'baggins@gmail.com'});
c. Ajout

Ajouter un élément à un ensemble en utilisant la commande UPDATE :

UPDATE users
SET emails = emails + {'fb@friendsofmordor.org'}
WHERE user_id = 1234;
d. Extraction

Page 5
TP4 : NOSQL Orientées Colonnes avec Cassandra

Extraire les adresses email comme ceci:

SELECT user_id, emails FROM users WHERE user_id = 1234;


Les données extraites sont retournées par ordre, selon leur type. Par exemple,
les données textuelles sont ordonnées par ordre alphabétique.

e. Suppression

Pour supprimer un élément de l’ensemble, utiliser l’opérateur (-):

UPDATE users SET emails = emails - {'fb@friendsofmordor.org'}


WHERE user_id = 1234;
Pour supprimer tout l’ensemble:

UPDATE users SET emails = {} WHERE user_id = 1234;


ou bien :

DELETE emails FROM users WHERE user_id = 1234;


Une fois vidée, une collection (ensemble, liste ou map) est assimilée ainsi à la
valeur null.

IV.2.2. Listes
Une liste est utilisée quand l’ordre d’insertion des éléments compte, ou quand
on veut pouvoir insérer la même valeur plusieurs fois.

a. Création

Ajouter une liste des meilleurs endroits visités à la table users.

ALTER TABLE users ADD top_places list<text>;


b. Insertion

UPDATE users
SET top_places = [ 'rivendell', 'rohan' ]
WHERE user_id = 1234;
On remarquera ici que les éléments de la liste sont placés entre crochets.

c. Ajout

Pour ajouter un nouvel élément à la fin de la liste :

Page 6
TP4 : NOSQL Orientées Colonnes avec Cassandra

UPDATE users
SET top_places = top_places + [ 'mordor' ]
WHERE user_id = 1234;
Pour affecter un élément à un emplacement donné (écrase l’ancienne
valeur) :

UPDATE users
SET top_places[1] = 'riddermark' WHERE user_id = 1234;
Quand un élément est ajouté à la fin (ou au début) de la liste, cette dernière
n’est pas lue. On écrit directement la valeur à son emplacement. Par contre,
quand un élément est placé dans une position particulière, Cassandra lit la
liste entière, puis ajoute le nouvel élément, ce qui provoque une plus grande
latence.

d. Suppression

Supprimer un élément de la liste, en utilisant son index:

DELETE top_places[3] FROM users WHERE user_id = 1234;


Supprimer tous les éléments ayant une valeur donnée d’une liste:

SET top_places = top_places - ['riddermark']


WHERE user_id = 1234;
L’utilisation de cette dernière commande est meilleure que la première, car
elle protège contre les problèmes d’accès concurrent: avec la première
méthode, si un autre client ajoute des éléments à la liste en même temps, on
risque de supprimer la mauvaise valeur, ce qui n’est pas un problème avec la
deuxième méthode.

e. Extraction

SELECT user_id, top_places FROM users WHERE user_id = 1234;

IV.2.3. Maps
Une map permet d’associer deux éléments, sous forme de clef/valeur. Elle
peut être utilisée, par exemple, pour sauvegarder les horaires des différents
évènements dans un profil utilisateur.

Page 7
TP4 : NOSQL Orientées Colonnes avec Cassandra

Chaque élément dans une Map est stocké dans Cassandra comme étant
une colonne que vous pouvez modifier, remplacer et requêter.

a. Création

ALTER TABLE users ADD todo map<timestamp, text> ;


b. Insertion

Un élément dans une Map est un couple d’éléments entre accolades,


séparés par une virgule.

UPDATE users SET todo = {


'2012-9-24' : 'enter mordor',
'2012-10-2 12:00' : 'throw ring into mount doom'
} WHERE user_id = 1234;
c. Ajout

Ajouter un élément spécifique, en utilisant comme clef la valeur du


timestamp entre crochets:

UPDATE users
SET todo['2012-10-2 12:00'] = 'throw my precious into
mount doom' WHERE user_id = 1234;
Utiliser INSERT pour spécifier des données dans une Map :

INSERT INTO users (user_id,todo) VALUES ( 1234,


{ '2013-9-22 12:01' : 'birthday wishes to Bilbo',
'2013-10-1 18:00' : 'Check into Inn of Prancing Pony'
});
Ceci remplacera toute la Map pour l’utilisateur frodo.

d. Suppression

DELETE todo['2012-9-24'] FROM users WHERE user_id = 1234;


e. Extraction

SELECT user_id, todo FROM users WHERE user_id = 1234;

Page 8

Vous aimerez peut-être aussi