Cassandra
Travaux Pratiques
Les exercices qui suivent sont à effectuer sur machine, avec Cassandra.
Après avoir lancé votre machine Cassandra (avec docker), vous pourrez
également interagir en ligne de commande avec cqlsh avec la
commande :
docker run -d --name cassandra-docker -p 9842:9842 cassandra
# Cette commande crée et démarre essentiellement un conteneur à partir de
l'image Cassandra avec le nom "cassandra-docker", et l'héberge sur le port
9842.
docker exec -it cassandra-docker bash
cqlsh
# ceci suppose que cassandra-docker est le nom de votre container
# it pour disposer d'un terminal interactif persistant
# cqlsh pour lancer cette commande au démarrage
L’objectif de ces travaux pratiques est la mise en place d’une base
de données représentant des restaurants, et des inspections de ces
restaurants.
Note
Avant de vous lancer dans le travail proprement dit, vous êtes
invités fortement à prendre le temps d’ouvrir cette archive zip et
d’en examiner le contenu (au moins les en-têtes, pour avoir une
première idée de la structure des données initiales).
Bien entendu, on supppose qu’à terme cette base contiendra tous
les restaurants du monde, et toutes les inspections, ce qui justifie
d’utiliser un système apte à gérer de grosses volumétries.
Partie 1: Approche relationnelle
Nous allons étudier ici la création d’une base de données
(appelée Keyspace), puis son interrogation. Cette première phase
du TP consiste à créer la base comme si elle était relationnelle, et
à effectuer des requêtes simples. Une fois les limites atteintes, nous
utiliserons les spécificités de Cassandra pour aller plus loin.
Création de la base de données
Avant d’interroger la base de données, il nous la créer. Pour
commencer:
CREATE KEYSPACE IF NOT EXISTS resto_NY WITH REPLICATION = { 'class' :
'SimpleStrategy', 'replication_factor': 1};
CASSANDRA TP2 | PR. SAIDA ELMENDILI 1
Nous créons ainsi une base de données resto_NY pour laquelle le
facteur de réplication est mis à 1.
Sous cqlsh, vous pouvez maintenant sélectionner la base de
données pour vos prochaines requêtes.
USE resto_NY;
Tables
Nous pouvons maintenant créer les tables (Column Family pour
Cassandra) Restaurant et Inspection à partir du schéma suivant :
CREATE TABLE Restaurant (
id INT, Name VARCHAR, borough VARCHAR, BuildingNum VARCHAR, Street
VARCHAR,
ZipCode INT, Phone text, CuisineType VARCHAR,
PRIMARY KEY ( id )
) ;
CREATE INDEX fk_Restaurant_cuisine ON Restaurant ( CuisineType ) ;
CREATE TABLE Inspection (
idRestaurant INT, InspectionDate date, ViolationCode VARCHAR,
ViolationDescription VARCHAR, CriticalFlag VARCHAR, Score INT, GRADE
VARCHAR,
PRIMARY KEY ( idRestaurant, InspectionDate )
) ;
CREATE INDEX fk_Inspection_Restaurant ON Inspection ( Grade ) ;
Nous pouvons remarquer que chaque inspection est liée à un
restaurant via l’identifiant de ce dernier.
Pour vérifier si les tables ont bien été créées (sous cqlsh).
DESC Restaurant;
DESC Inspection;
Nous pouvons voir le schéma des deux tables mais également des
informations relatives au stockage dans la base Cassandra.
Import des données
Maintenant, nous pouvons importer les fichiers CSV pour remplir
les Column Family :
1. Décompresser le fichier “[Link]” (il contient
le fichier “[Link]” et
“restaurants_inspections.csv”)
Note
CASSANDRA TP2 | PR. SAIDA ELMENDILI 2
En mode console, sur le répertoire de téléchargement du
fichier [Link], il suffit de mettre la commande :
unzip [Link]
2. Importer un fichier CSV :
▪ Dans votre console (machine locale, pas docker), copier
les fichiers sous « Docker » (container “Cassandra”)
▪ docker cp path-to-file/[Link] docker-
container-ID:/
▪ docker cp path-to-file/restaurants_inspections.csv
docker-container-ID:/
Note
Le chemin « path-to-file » correspond à l’endroit où a été
décompressé le fichier [Link]
Le docker-container-ID peut être récupéré grâce à la
commande « docker ps ».
Le container-ID est : ba1040313a70
Exemple :
docker cp C:/restaurants/[Link]
ba1040313a70:/
docker cp
C:/restaurants/restaurants_inspections.csv
ba1040313a70:/
Note
Les fichiers sont copiés à la racine du container, si vous le
changez il faut l’impacter dans l’instruction précédente.
Vous pouvez vérifier l’existence des fichiers dans le
container avec :
ls /*.csv
Dans la console cqlsh, importer les fichiers “[Link]”
et “restaurants_inspections.csv”
CASSANDRA TP2 | PR. SAIDA ELMENDILI 3
use resto_NY ;
COPY Restaurant (id, name, borough, buildingnum, street,
zipcode, phone, cuisinetype)
FROM '/[Link]' WITH DELIMITER=',';
COPY Inspection (idrestaurant, inspectiondate,
violationcode,
violationdescription, criticalflag,
score, grade)
FROM '/restaurants_inspections.csv' WITH DELIMITER=',';
Pour vérifier le contenu des tables:
SELECT count(*) FROM Restaurant;
SELECT count(*) FROM Inspection;
Interrogation
Les requêtes qui suivent sont à exprimer
avec CQL (pour Cassandra Query Language) qui est fortement
inspirée de SQL.
CASSANDRA TP2 | PR. SAIDA ELMENDILI 4
Requêtes CQL
Pour la suite des exercices, exprimer en CQL les requêtes suivantes
:
1. Liste de tous les restaurants.
2. Liste des noms de restaurants.
3. Nom et quartier (borough) du restaurant N° 41569764.
4. Dates et grades des inspections de ce restaurant.
5. Noms des restaurants de cuisine Française (French).
6. Noms des restaurants situés
dans BROOKLYN (attribut borough).
7. Grades et scores donnés pour une inspection pour le
restaurant n° 41569764 avec un score d’au moins 10.
8. Grades (non nuls) des inspections dont le score est
supérieur à 30.
9. Utilisons les deux indexes
sur Restaurant (borough et cuisineType). Trouvez tous
les noms de restaurants français de Brooklyn.
CASSANDRA TP2 | PR. SAIDA ELMENDILI 5