Académique Documents
Professionnel Documents
Culture Documents
I.S.I.T.Com.
i
Apache Spark et Apache Spark SQL. Apache Spark SQL facilite le traitement, l’analyse et
in
l’intégration de données structurées et semi-structurées à grande échelle. Il permet notamment
de tirer parti du langage SQL pour interroger et analyser des données, tout en bénéficiant des
performances et de l’évolutivité d’Apache Spark.
u
Á la fin de ce TP, vous devez être en mesure, d’ingérer des données dans Spark et explorer
les données et les transformer (Data Cleaning, Data Wrangling) avec Spark SQL. Le TP présente
IT - Jo
également une session illustrative sur l’ingestion des données à partir de la base DaaS MongoDB
Atlas.
Sommaire
m
led
Exercices
1 Chargement, profilage, interrogation et visualisation des données
Sous databricks, vous pouvez vous connecter à des sources de données externes (fichiers hdfs,
tables hive, Mysql, DaaS, etc.), soit créer vos propres tables, ou bien uploader des fichiers.
Databricks dispose d’un (niveau d’abstraction de) système de fichiers intégré dans lequel il est
possible de mettre des fichiers de données, des images et même des bibliothèques externes.
Une fois les données chargées sous Saprk, il est possible de les manipuler soit avec l’API
DataFrame ou avec SQL. Dans la suite nous allons explorer les principales possibilités de charge-
ment, d’exploration et de transformation de données offertes par Spark à travers 3 jeux de
i
données.
in
1.1 Création d’un Cluster et chargement de données locales au format JSON
u
Databricks offre un environnement cloud prêt à l’emploi pour la création de notebooks connectés
à un cluster Spark. Un notebook est une interface web contenant des commandes exécutables
1.
IT - Jo
(interprétées), des graphiques et des commentaires (markdown).
Sous Databricks, créez un cluster Spark M yCluster pour pouvoir exécuter vos Notebooks.
Pour créer un Cluster, faites-le à partir de l’onglet ”Compute”
m
led
https://drive.google.com/file/d/1qQMz-q4nsGHCzEmedkF2517rOhhSlhcm/view?usp=
sharing
K
3. Rendez vous sous l’onglet ”Data” et uploadez les données que vous venez de
télécharger sous DBFS comme montré dans la figure ci-après.
IS
i
u in
IT - Jo
m
led
Co
Retenez le chemin vers vos fichiers, affichés en bas de la forme.
ha
4. Rendez vous sous l’onglet ”Workspace” pour créer un nouveau notebook [NB movies].
5. Les DataFrames sont des structures de données bidimensionnelles similaires à des tables
K
de base de données ou à des feuilles de calcul. Le DataFrame API offre un moyen puissant de
traiter et d’analyser ces données de manière distribuée.
Utilisez la commande ci-après pour créer un dataframe à partir des fichiers json. Dans la
IS
plupart des cas, il vaut mieux laisser à Spark le soin d’inférer le schéma (vous pouvez modifier le
schéma inféré avec la commande withColumn()). Les fichiers json à notre disposition n’ont pas
tout à fait le même format (éditez les pour le constater). Dans le premier chaque objet occupe
une et une seule ligne. Dans le deuxième chaque objet peut occupé plusieurs lignes. Nous avons
de ce fait utilisé deux commandes différentes.
dfMovies = spark.read.option("multiline","true").json("/FileStore/tables/moviesAvecRef.json")
dfMovies.printSchema()
display(dfMovies)
i
in
7. L’outil ”Visualization” permet de créer, personnaliser et afficher des visualisations interac-
u
tives de données directement dans leurs notebooks Databricks. Utilisez cet outil pour créer des
graphiques rapides à partir de vos données.
IT - Jo
m
led
Co
ha
K
IS
i
in
1.3 Interrogation des dataframes
u
8. Le DataFrame API est disponible dans plusieurs langages de programmation, dont Scala,
Python, R et SQL. Testez les 2 commandes ci-après écrites en Python et expliquez les résultats
IT - Jo
dfMovies.filter(dfMovies[’genre’]==’drama’).show()
m
dfMovies.filter(dfMovies[’actors. id’]==’artist:15’).show()
led
Co
9. Utilisez la commande explode pour ”aplatir” la colonne Actors et ré-essayez d’exécuter la
requête
ha
10. L’API DataFrame offre la possibilité de lier des sources de données à travers l’opération de
jointure. Utilisez cette opération à bon escient du fait de son coût d’exécution important dans
les environnements hautement distribués comme l’est Apache Spark. Testez la requête ci-après
écrite en python pour afficher les titres des films du genre drama et les noms de leurs réalisateurs.
11. Il est possible d’interroger un dataframe avec le langage SQL. La commande createOrReplaceTempView
permet de créer une vue temporaire à partir des données contenues dans un DataFrame. Une
vue temporaire est un objet qu’on peut utiliser pour exécuter des requêtes SQL ou des opérations
SQL-like sur les données du DataFrame.
artistsDF.createOrReplaceTempView(’artists’)
moviesDF.createOrReplaceTempView(’movies’)
12. Vous pouvez désormais exécuter des requêtes SQL sur les vues ”artists” et ”movies” et
même faire des jointures en langage SQL.
%sql
select birth date, count(*) as nb artists from artists group by (birth date)
order by nb artists desc
%sql
select movies.*, artists.* from movies, artists where movies.director. id = artists. id
13. Les résultats de l’exécution d’une requête SQL sont affectés au Dataframe par défaut
sqldf.
i
14. Exécuter les requêtes permettant de :
in
1. Trouver les noms des réalisateurs qui ont réalisé des films du genre ’drama’
u
3. Trouver le nombre de films dans lesquels a joué ”Clint Eastwood” et parus avant l’année
2000.
IT - Jo
4. Compter le nombre d’acteurs dirigés par chaque réalisateur.
m
15. Créez un dashboard avec les différents graphiques
led
Les étapes que nous allons : (i) créer un cluster MongoDB ATLAS; (ii) importer de
données dans ATLAS avec mongoimport; (iii) configurer le driver de MongoDB dans le cluster
Spark; et (iv) configurer de l’accès à la base depuis un notebook.
i
u in
17. Créez un utilisateur et affectez lui un mot de passe sous le menu [Security/Database Access]
comme illustré ci-après.
IT - Jo
m
led
Co
ha
K
IS
18. Sous le menu [Security/Network Access] . Autorisez l’accès à votre cluster MongoDB à
partir de votre adresse IP actuelle, ou temporairement de n’importe quelle adresse IP pour
simplifier.
i
in
19. Sous le menu [Security/Network Access] . Autorisez l’accès à votre cluster MongoDB à
partir de votre adresse IP actuelle, ou temporairement de n’importe quelle adresse IP pour
simplifier.
u
IT - Jo
m
led
Co
ha
20. Cliquez sur le bouton [Connect] et copiez la chaı̂ne de connexion à votre cluster.
K
IS
i
commande. L’argument jsonArray de la commande indique à l’utilitaire d’import qu’il s’agit
in
d’un tableau d’objets à créer individuellement, et non d’un unique document JSON.
u
mongoimport --uri mongodb+srv://khaled:khaledcluster0.rnw57vy.mongodb.net/dbMovies
--collection artists --file c:\artists.json --jsonArray
IT - Jo
24. Rendez vous sous l’interface graphique ATLAS et vérifiez que la base dbMovies a été créée
et que les données ont bien été chargées.
m
led
Co
ha
K
25. Sous le menu [Aggregation] créer une requête permettant faire la jointure entre artists et
moviesRef et enregistrez le résultat dans une nouvelle collection movies.
IS
26. Vous pouvez, si vous le souhaitez, explorer vos données à travers les charts offerts par
ATLAS (bouton [VISUALIZE YOUR DATA]) comme montré ci-après.
i
u in
IT - Jo
m
27. Atlas offre également la possibilité de créer des tableaux de bord plus élaborés sous le
led
menu [charts]Co
ha
28. Sous ATLAS, vous pouvez si vous le souhaitez créer un web service REST permettant
l’accès à votre base Cloud. Si vous le souhaitez le faire, rendez vous sous le menu [Data API]
K
IS
29. Pour pouvoir nous connecter à une base MongoDB à partir de Databricks, il est nécessaire
d’installer le driver de MongoDB dans notre Cluster.
Accédez à la page de détails du cluster et sélectionnez l’onglet [Libraries]. Cliquez sur le
bouton [Install New]. Sélectionnez Maven comme source de bibliothèque. Utilisez la fonction de
recherche de packages pour trouver le connecteur ’mongo-spark’. Cela devrait pointer vers org.
mongodb.spark:mongo-spark-connector_2.12:3.0.1 ou une version plus récente. Cliquez
ensuite sur Installer.
i
u in
IT - Jo
30. Créez un nouveau Notebook [NB ATLAS] et attachez-le à votre Cluster. Avant de vous
connecter à votre base Cloud, récupérez la chaı̂ne de connexion (pyhton) depuis l’interface
d’ATLAS.
Exécutez ensuite les commandes ci-après pour vous accéder à votre base CLoud depuis
m
votre notebook.
led
Co
ha
K
IS
i
u in
3 Transformation des données et Machine Learning élémentaire
3.1 IT - Jo
Transformation des données
Dans cette partie du TP nous allons importer des données sur la COVID-19 et les transformer
pour pouvoir créer un modèle prédictif de l’évolution du nombre de nouveau cas en fonction
m
des cas rapportés précédemment. Les données sont au format csv et fournies par https://
led
ourworldindata.org/.
Le jeu de données contient plusieurs valeurs NULL qui doivent être supprimées avant de
Co
procéder à l’apprentissage du modèle. Le nombre de cas précédemment rapportés doit également
être ajoutés à chaque ligne du jeu de données. Ces transformations sont nécessaires sachant que
l’objectif est de prédire le nombre de nouveaux cas en fonctions des cas rapportés il y a 1 semaine,
ha
2 semaines et 3 semaines.
https://drive.google.com/file/d/1Kt8QHpZ-gL4tWpZn1PhJ7mYBtmi7RslY/view?usp=sharing.
Chargez les données dans Databricks comme décrit précédemment.
IS
34. Créez un nouveau notebook [NB covid]. Chargez les données dans un Dataframe dfCovid
comme suit.
35. Utilisez l’outil de profilage des données pour repérer les colonnes contenant des valeurs
nulles.
36. Comme vous pouvez le constater, la colonne date du dataframe est au format String. Il est
primordial de transformer cette colonne au format date pour pouvoir faire des jointures sur les
dates ultérieurement. Pour celà nous allons définir une fonction func utilisant une expression
lambda pour transformer cette colonne au format date de python.
dispaly(dfCovid)
i
in
37. L’étape suivante consiste à supprimer les valeurs NULL avec la fonction dropna, notam-
ment de la colonne contenant la variable à prédire (new cases smoothed per million).
u
dfCovid = dfCovid.dropna(subset="iso code")
dfCovid = dfCovid.dropna(subset="new cases smoothed per million")
IT - Jo
38. Nous allons maintenant trier les données,renommer la variable cible et faire une projection
pour ne garder que la date, le pays et le nombre de cas quotidiens par million d’habitants. Le
moyen le plus simple est de le faire avec SQL.
m
dfCovid.createOrReplaceTempView("covid")
led
dfCases = spark.sql("select date, iso code, new cases smoothed per million as new cases
from covid order by date, iso code")
Co
dfCases.createOrReplaceTempView("cases")
display(dfCases)
ha
40. Avec le code ci-après nous créons deux vues sur le même dataframe pour récupérer le
nombre de cas à j-7 et à j-15.
dfCases.createOrReplaceTempView("j7")
dfCases.createOrReplaceTempView("j15")
i
AND datediff(cases.date, j15.date)=15
order by cases.date")
in
display(df)
u
41. Comme nous disposons de données catégorielles dans plusieurs de nos colonnes, il est
IT - Jo
nécessaire de les convertir en une représentation numérique. Pour ce faire, nous utiliserons un
StringIndexer, qui associe chaque colonne de chaı̂nes de caractères à un vecteur de nombres
de longueur égale au nombre total de chaı̂nes uniques dans cette colonne.
m
from pyspark.ml.feature import StringIndexer
led
stringIndexer = StringIndexer(inputCol="iso code",outputCol="countryIDX")
df = stringIndexer.fit(df).transform(df)
Co
42. La plupart des algorithmes de Spark MLlib acceptent une seule colonne en entrée. Spark
MLlib fournit le transformateur VectorAssembler permettant de créer un seul vecteur con-
ha
tenant toutes les variables explicatives. Le bloc de code suivant illustre comment utiliser
VectorAssembler.
43. Nous allons maintenant diviser le jeu de données en un jeu d’apprentissage et un jeu de
test. Pour cet exemple précis, nous n’allons pas utiliser la fonction randomSplit fournie par
Spark car nous devons préserver l’ordre des données.
45. En plus des graphiques fournis par défaut par Databricks, il est possible de créer ses pro-
i
pres graphiques avec des bibliothèques comme matplotlib
in
import matplotlib.pyplot as plt
import numpy as np
u
predicted values = np.array(predictions.select("prediction").rdd.map(lambda x: x[0]).collect())
true values = np.array(predictions.select("new cases").rdd.map(lambda x: x[0]).collect())
IT - Jo
residuals = true values - predicted values
indices = np.array(range(len(predictions.collect())))
m
led
plt.figure(figsize=(10, 6))
plt.scatter(indices, residuals, marker=’o’, color=’blue’, alpha=0.7)
plt.axhline(y=0, color=’red’, linestyle=’--’)
Co
plt.xlabel("Row Index")
plt.ylabel("Residuals")
ha
plt.title("Residual Plot")
plt.grid(True)
plt.show()
K
IS
46. Essayez d’autres algorithmes de régression que la régression linéaire (e.g. DecisionTreeRegressor,
RandomForestRegressor, etc.) et comparez les résultats.
i
fait que Power BI est davantage destiné au traitement des données au niveau de l’entreprise,
in
tandis que Databricks est capable de gérer de gros volumes de données (Big Data). Spark SQL
est généralement plus puissant pour l’ingestion et la transformation des données, tandis que
Power BI permet une génération plus simple de graphiques, de tableaux de bord et de rapports.
u
Databricks Spark permet également l’intégration de modèle de machine learning avancé à travers
Spark MLlib et également l’itégration de flux de données avec Spark Structured Streaming.
IT - Jo
Cette section est session illustrative de Power BI. La suite suppose que vous avez déjà
installé Power BI Desktop.
m
47. La connexion à notre base Cloud ATLAS depuis Power BI requière de procéder aux étapes
led
ci-après.
Co
1. Dans l’interface d’ATLAS, sous le menu Database et boutton [Connect], choisissez l’option
ATLAS SQL
ha
K
2. Dans l’interface suivante ardez l’option ”Quick Start” et copier l’url de connexion à votre
IS
base.
4. Le traitement des champs non-scalaires peut être compliqué sous Power BI. Poir cette rai-
son, nous allons créer une nouvelle collection moviesRef2 dans laquelle nous ”applatissons”
le document imbriqué director avec la requête Aggregation Pipeline ci-après.
[
{$project: { id: 1, title: 1, year: 1, genre: 1, summary: 1, country: 1,
actors: 1, "directorId": "$director. id", },}
{$out: "moviesRef2",}
]
Expliquez ce code.
Une fois ses étapes terminées, lancez Power BI Desktop et suivez lees étapes ci-après pour vous
connecter à votre base Cloud.
1. Cliquez sur [Obtenir de données], puis dans la barre de recherche tapez Atlas. Sélectionnez
le connecteur qui s’affiche
i
u in
IT - Jo
2. fournissez l’url que vous avez récupérée de l’interface d’ATLAS, le nom de votre base et le
login/mot de passe de votre utilisateur ATLAS.
m
led
Co
ha
A la fin de ces étapes, si tout se passe bien, Power BI desktop aura chargé les données des
collections de votre base Cloud. Vous pouvez explorer les données, changez les types des données
K
48. Dans Power BI, créez différents graphiques à partir de la table moviesRef2, comme nombre
de films par genre, nombre de films par pays, etc. Vous pouvez vérifier que les visuels sont
dynamiques et interliés.
i
u in
IT - Jo
49. Pour pouvoir faire des visuels impliquant des données de deux tables diférentes, il est
m
nécessaire de lier ces tables (e.g. nombre de films par réalisateur). Sur le volet gauche de
led
l’interface, cliquez sur pour indiquer que moviesRef2 fait référence à artists. Vous pouvez
Co
constater par vous-même que cette jointure n’est pas possible entre moviesRef et artists
ha
K
IS
50. Vous pouvez maintenant faire des graphiuqes impliquant des données des deux tables.
i
u in
IT - Jo
51. Pour partager et publier votre rapport cliquez sur Publier . Ceci ouvre votre rapport
dans Power Bi Cloud, où vous pouvez accéder à des fonctionnalités supplémentaires et partager
votre rapport avec d’autres personnes.
m
5 Travail à faire chez soi
led
52. Utilisez le jeu de données sur la COVID-19 pour créer des rapports avec les chiffres et les
Co
graphiques clés. Transofrmez les données pour supprimer les valeurs nulle et ne garder que les
colonnes pertienentes et les lignes correspondant à la Tunisie, l’Italie, la France et l’Allemagne.
ha
Publiez votre rapport sur Power BI CLoud et ajoutez tout ce qui vous semble pertinent.
N.B. Si vous rencontrez des difficultés pour convertir le texte en nombre, rendez vous à la
fenêtre de transformation des données. Puis sous le menu Fichier/Options et paramètres/Options/paramètres
K
Régionaux, choississez Anglais. Le plus souvent l’erreur est due au fait que par défaut le
séparateur de décimal est ”.” et non ”,”.
IS