· 7 years ago · Nov 08, 2018, 03:36 PM
1Cassandra - Travaux Pratiques1
2Les exercices qui suivent sont à effectuer sur machine, avec Cassandra.
3Après avoir lancé votre machine Cassandra (avec docker), vous aurez besoin d’une interface cliente pour y accéder. Pour cela, nous utiliserons DevCenter de DataStax: DevCenter : <https://academy.datastax.com/downloads/ops-center#devCenter>
4Pour une installation sous Windows, il faut télécharger le serveur : https://cassandra.apache.org/download/ Un guide complet à suivre pour l’installation est disponible ici : http://www.datastax.com/2012/01/getting-started-with-apache
5Le sujet des travaux pratiques est la mise en place d’une base de données représentant des restaurants, et des inspections de ces restaurants. Partie 1: Approche relationnelle
6Nous allons étudier ici la création d’une base de données (appelée Keyspace), puis son interrogation.
7Création de la base de données
8CREATE KEYSPACE IF NOT EXISTS resto_NY WITH REPLICATION = { 'class' : 'SimpleStrategy','replication_factor': 1};
9Nous créons ainsi une base de données resto_NY pour laquelle le facteur de réplication est mis à 1, ce qui suffit dans un cadre centralisé. Sous csqlsh, vous pouvez sélectionner la base de données pour vos prochaines requêtes. USE resto_NY; L’équivalent existe dans une interface graphique bien entendu. Tables Nous pouvons maintenant créer les tables (Column Family pour Cassandra) Restaurant et Inspection à partir du schéma suivant : CREATE TABLE Restaurant (
10id INT, Name VARCHAR, borough VARCHAR, BuildingNum VARCHAR, Street VARCHAR, ZipCode INT, Phone text, CuisineType VARCHAR, PRIMARY KEY ( id ) ) ;
11CREATE INDEX fk_Restaurant_cuisine ON Restaurant ( CuisineType ) ;
12CREATE TABLE Inspection (
13idRestaurant INT, InspectionDate date, ViolationCode VARCHAR, ViolationDescription VARCHAR, CriticalFlag VARCHAR, Score INT, GRADE VARCHAR, PRIMARY KEY ( idRestaurant, InspectionDate )) ;
14CREATE INDEX fk_Inspection_Restaurant ON Inspection ( Grade ) ;
15Nous pouvons remarquer que chaque inspection est liée à un restaurant via l’identifiant de ce dernier.
16Pour vérifier si les tables ont bien été créées (sous cqlsh). DESC Restaurant; DESC Inspection;
17Nous pouvons voir le schéma des deux tables mais également des informations relatives au stockage dans la base Cassandra.
18Import des données Maintenant, nous pouvons importer les fichiers CSV pour remplir les ColumnFamily : 1. Décompresser le fichier ‘restaurants.zip’ (il contient le fichier ‘restaurants.csv’
19et ‘restaurants_inspections.csv’) Note
20En mode console, sur le répertoire de téléchargement du fichier restaurants.zip, il suffit de mettre la commande :
21unzip restaurants.zip
222. Importer un fichier CSV :
23▪ Dans votre console (machine locale, pas docker), copier les fichiers sous “Docker†(container ‘Cassandra’) docker cp path-to-file/restaurants.csv docker-container-ID:/ docker cp path-to-file/restaurants_inspections.csv docker- container-ID:/ Note
24Le chemin “path-to-file†correspond à l’endroit où a été décompressé le fichier restaurants.zip le docker-container-ID peut être récupéré grâce à la commande “docker psâ€. CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES b1fa2c7c255d poklet/cassandra:latest "/bin/sh -c start" 6 minutes ago Up 6 minutes 0.0.0.0:32787- >22/tcp, 0.0.0.0:32786->7000/tcp, 0.0.0.0:32785->7001/tcp, 0.0.0.0:32784->7199/tcp, 0.0.0.0:32783->8012/tcp, 0.0.0.0:32782->9042/tcp, 0.0.0.0:32781->9160/tcp, 0.0.0.0:32780->61621/tcp cassandra le container-ID est : b1fa2c7c255d 3. Dans la console cqlsh, importer les fichiers ‘restaurants.csv‘ et
25‘restaurants_inspections.csv‘ use resto_NY COPY Restaurant (id, name, borough, buildingnum, street, zipcode, phone, cuisinetype) FROM '/restaurants.csv' WITH DELIMITER=','; COPY Inspection (idrestaurant, inspectiondate, violationcode, violationdescription, criticalflag, score, grade) FROM '/restaurants_inspections.csv' WITH DELIMITER=',';
26Note
27
28les fichiers sont copiés à la racine du container, si vous le changez il faut l’impacter dans l’instruction précédente.
29Pour vérifier le contenu des tables:
30SELECT count(*) FROM Restaurant; SELECT count(*) FROM Inspection;
31Interrogation Les requêtes qui suivent sont à exprimer avec CQL (pour Cassandra Query Language) qui est fortement inspirée de SQL. Vous trouverez la syntaxe complète ici : <https://cassandra.apache.org/doc/latest/cql/dml.html#select>).
32Requêtes CQL simples Pour la suite, exprimer en CQL les requêtes suivantes : 1. Liste de tous les restaurants.
332. Liste des Noms de restaurants. 3. Nom et quartier (borough) du restaurant N° 41569764.
344. Dates et grades des inspections de ce restaurant. 5. Noms des restaurants de cuisine Française (French).
356. Noms des restaurants situés dans BROOKLYN (attribut borough). 7. Grades et scores donnés pour une inspection pour le restaurant n° 41569764
36avec un score d’au moins 10. 8. Grades (non nuls) des inspections dont le score est supérieur à 30.
379. Nombre de lignes retournées par la requête précédente. 10. Grades des inspections dont l’identifiant est compris entre 40 000 000 et
3840 000 100. Aide: Utiliser la fonction ‘token()‘. 11. Compter le nombre de lignes retournées par la requête précédente.
39Aide: Utiliser ‘COUNT(*)’
40CQL Avancé
411. Pour la requête ci-dessous faites en sorte qu’elle soit exécutable sans ALLOW
42FILTERING.
43SELECT Name FROM Restaurant WHERE borough='BROOKLYN' ;
442. Utilisons les deux indexes sur Restaurant (borough et cuisineType). Trouvez
45tous les noms de restaurants français de Brooklyn. 3. Utiliser la commande TRACING ON avant la d’exécuter à nouveau la requête
46pour identifier quel index a été utilisé. 4. On veut les noms des restaurants ayant au moins un grade ‘A’ dans leurs
47inspections. Est-ce possible en CQL?