Académique Documents
Professionnel Documents
Culture Documents
Mmysparksqlvf17012017 170117192012 PDF
Mmysparksqlvf17012017 170117192012 PDF
DR MUSTAPHA MICHRAFY
CONTACT : DATASCIENCE.KM@GMAIL.COM
CONTEXTE M.MICHRAFY
2
PLAN M.MICHRAFY
1. Contexte
2. Objectif et prérequis
3. Spark SQL, Motivations
4. Spark SqL et introduction de Catalyst Optimizer
5. Aperçu sur les objets du module Spark SQL
6. Nouvelle architecture Spark ( 2.x)
7. DataWorkflow et Catalyst Optimizer
8. Zoom sur SParkSESSION
9. DataSet et DataFrame
10.DataFrame, caractéristiques, formats supportés, création
11.Chargement et persistance des données
12.DataFrameNaFunctions et Préparation des données
13.Graphe de conversion entre Collection, RDD, DataFrame et DataSet
14.Opérations sur les DataSets et les DataFrames
3
OBJECTIF ET PRÉREQUIS M.MICHRAFY
Objectif Prérequis
Cette étude porte sur la brique Spark SQL de • Connaissance de l’approche objet
la plateforme Apache Spark. Il vise à • Connaissance de la programmation
présenter les concepts et les fonctionnalités fonctionnelle
de spark SQL. • Connaissance du langage Scala
• Connaissance de Spark
4
SPARK SQL : DÉFINITION ET MOTIVATIONS ? M.MICHRAFY
Cas d’utilisation
• S’interfacer avec un tableau de bord en utilisant
tableau, Qlik
• Réaliser des requêtes SQL sans faire appel à la
sémantique RDD
• Préparation et Analyse des données à travers l’utilisation
de l’API DataFrame/DataSet avec opérations optimisées
et riches à l’image du package dplyr de R
5
SPARK SQL ET INTRODUCTION DE CATALYST OPTIMIZER
1
Constat 1 Un besoin pour des opérations ETL vers et
La popularité des systèmes à partir de diverses sources de données,
Limite
relationnels montre que les (semi) structurée, nécessitant un code
L’approche relationnelle
utilisateurs favorisent l’écriture des personnalisé.
est insuffisante pour la
requêtes déclaratives. 2
majorité des applications
Constat 2 BigData, car : L’analyse avancée -basée sur des
algorithmes complexes- ne peut être
Les workflows de données
réalisée par l’approche relationnelle
peuvent être exprimés par une À noter …
combinaison de requêtes
Ces deux systèmes - relationnel et procédural – sont restés jusqu'à la
relationnelles et d’algorithmes
version 1.0.2 de Spark largement disjointes, forçant les utilisateurs à
complexes.
choisir un paradigme ou l'autre.
7
NOUVELLE ARCHITECTURE SPARK ( 2.X)
Storage
8
DATAWORKFLOW ET CATALYST OPTIMIZER
SQL AST
Catalyst Optimizer
DataFrame RDDs
Query Plan Optimization
Query
DataSet
9
SPARKSESSION
Point d’entrée Fonctionnalités
• SparkSession est le point d’entrée de l’API • Accéder à SparkContext
DataSet/Dataframe, depuis la version 2.0.0 • Accéder à SparkSql pour garantir la cohérence des versions
• SparkSession est une classe qui peut être créée à de Spark SQL
partir du Builder. • Créer des DataFrames à partir des RDD ou des collections
• Elle appartient au package org.apache.spark.sql • Créer des DataSet
• Créer une DataFrame ou une DataSet vide
• Créer une DataSet avec une seule colonne
Builder • Exécuter une requête Sql et retourner une dataframe.
• Builder est une classe interne pour SparkSession. • Accéder à des Interfaces permettant de charger une
• Cette dernière permet de gérér, créer et DataSet, en mode batch ou flux continu, à partir de
configurer une session spark SQL systèmes de stockage externes (TEXT, CSV, JSON, ORC,
• Il dispose de : PARQUET, Cle/valeur, JDBC)
• Constructeur sans argument
• appName pour fixer le nom de l’application
• Config pour fixer les options de la conf.
• getOrCreate pour retourner une session
À noter bien
• La majorité des méthodes sont au stade expérimental et sont disponibles à partir de la version 2.
• D’autres méthodes sont dédiés aux développeurs de l’API Spark
• Avant la version 2.0.0, la classe utilisée est SparkSql
10
DATASET ET DATAFRAME
DataSet DataFrame
• DataSet est une collection distribuée de données • DataFrame est une DataSet avec des éléments
• L’Api DataSet a été introduit dans Spark à partir de type Row.
de la version 1.6. • Une DataFrame est l’équivalent d’une table dans
• La dataSet est fortement typée. une base de données ou une dataFrame dans R
• DataSet supporte des transformations basées sur ou Python.
des paradigmes fonctionnels ou relationnels • Une DataFrame est non typée.
• À l’image de la RDD, une DataSet dispose des • Une DataFrame peut être construite à partir
opérations de type transformation et Action. d’une source de données structurées, des tables
• Une DataSet est paresseuse, par conséquent le Hive, des BD ou des RDDs.
calcul se déclenche pour des opérations de type • L’API DataFrame est disponible en Scala, Java,
action. Python et R.
• L’API DataSet est disponible pour le langage
Scala et Java, pas pour Python
11
M.MICHRAFY
DATAFRAME, CARACTÉRISTIQUES, FORMATS SUPPORTÉS, CRÉATION
Immutable
In-Memory Lazy
evaluated
Cacheable unTyped
Partitioned
12
CHARGEMENT ET PERSISTANCES DES DONNÉES 1/2
DataFrameReader DataFrameWriter
• DataFrameReader a pour objectif de charger des • DataFrameWriter permet de persister des DataSet
DataSet à partir d’un système de stockage externe dans un système de stockage externe tels qu’un
tels qu’un système de fichier, une table relationnelle, système de fichier, JDBS, HIVE, Stockage clé-valeur,
un stockage clé-valeur, etc. etc.
• L’accès à cette classe se fait à partir d’une session • L’accès à cette classe se fait à partir d’une session
sparkSession via le membre read. sparkSession via le membre write.
• Elle dispose des méthodes dédiées à des formats • Cette classe dispose des méthodes :
de type TXT, JSON, Parquet, Orc, CSV. Pour cela, • format : spécifier le format de données (json, txt,
utiliser les méthodes txt, json, orc, csv, parquet, parquet, orc, csv)
textFiles, jdbc… • modeSave : préciser le comportement lorsque
• Elle dispose aussi d’une méthode générique, notée la donnée ou la table existe.
load, nécessitant la spécification du format, du • Option(s) : ajouter une ou plusieurs options
schéma et des options. relative la source de données de sortie
• La majorité des méthodes de chargement • save : enregistrer le contenu de la dataFrame
retournent des dataFrames à l’exception de la • jdbc, csv, parquet, orc, txt : sont des méthodes
méthode textFiles retourne une DataSet[String] pour enregistrer le contenu dans un format
spécifique.
Caractéristiques Fonctionnalités
• Il offre des fonctionnalités pour gérer les valeurs • Méthodes de type drop : elles permettent de
manquantes dans une dataFrame. supprimer des lignes ou des colonnes contenant
null or NaN, selon certains critères et retournent
• Une instance de cette classe peut être créée en une nouvelle dataFrame
faisant appel à la méthode na de la dataSet.
• Méthodes de type fill : elles permettent de
• C’est une classe «final». Par conséquent, elle substituer certaines valeurs (nulles ou NaN) et
n’est pas extensible retournent une nouvelle DataFrame
14
GRAPHE DE CONVERSION ENTRE LA RDD, DATAFRAME, DATASET
15
M.MICHRAFY
(*) : Les exemple du code ont été exécutés avec spark-shell, version 2.0.2 16
DONNÉES UTILISÉES
people.txt people.json
Michael, {"name":"Michael"}
29Andy, {"name":"Andy","age":30}
30Justin, 19 {"name":"Justin", "age":19}
Les deux fichiers people.txt et people.json sont livrés avec la distribution d’Apache
spark.
17
SPARKSESSION : CREATION ET CONFIGURATION M.MICHRAFY
Objectif Exemple
SparkSession est le point d’entrée // importer sparkSession
pour le module Spark Sql
La création d’un objet SparkSession se import org.apache.spark.sql.SparkSession
fait via l’objet builder qui est une
classe interne de SparkSession /***
package : org.apache.spark.sql Créer sparkSession
Nommer l’application
Configurer l’application
Importer le package SparkSession en enfin retourner la session crée.
****/
// retour > spark: org.apache.spark.sql.SparkSession =
org.apache.spark.sql.SparkSession@5fd8dd66
Créer la session SparkSession val spark = SparkSession .builder()
.appName("Spark SQL")
.config("spark.some.config.option", "value")
.getOrCreate()
18
CRÉATION D’UNE DATAFRAME À PARTIR D’UNE SÉQUENCE M.MICHRAFY
Objectif Exemple
createDataFrame est une méthode
de la classe SparkSession permettant
import org.apache.spark.sql.SparkSession // importer sparkSession
de créer une dataFrame à partir val spark = SparkSession .builder().getOrCreate() // créer une session
d’une collection. // créer des sequences : seqVilles
val seqVilles = Seq(("Paris", 2015, 8),("Paris", 2015, 8),("Lyon", 2016, 7),("Lyon",
2017, 1),("Lyon", 2016, 7))
DataFrameReader Exemple
SparkSession dispose d’un membre import org.apache.spark.sql.SparkSession // importer sparkSession
noté read de type DataFrameReader
val spark = SparkSession .builder().getOrCreate() // Créer SparkSession
DataFrameReader permet de
charger une dataFrame ou une
val dfReader = spark.read //Pointer la DataFrameReader
DataSet via : // Retour > org.apache.spark.sql.DataFrameReader@a323a5b
• Un fichier format CSV // Créer des dataFrames via des fichier Json,
• Un fichier format TXT val dfJSON = dfReader.json("VotrPathSpark/people.json")
• Un fichier format JSON // retour > df: org.apache.spark.sql.DataFrame = [age: bigint, name: string]
• Un fichier format Parquet val dfCSV = dfReader.cvs("VotrPathSpark/people.txt")
• Un fichier format ORC // retour > dfcsv: org.apache.spark.sql.DataFrame = [_c0: string, _c1: string]
• Une table JDBC val dfparquet = dfReader.parquet("VotrPathSpark/users.parquet")
DataFrameReader permet aussi de //retour > dfparquet: org.apache.spark.sql.DataFrame = [_c0: string, _c1: string ... 1 more field]
spécifier le shéma. val dfTEXT = dfReader.txt("VotrPathSpark/people.txt")
// retour > dfTXT: org.apache.spark.sql.DataFrame = [value: string]
Créer la session
// afficher le contenu des dataframes avec la methode show()
SparkSession
dfJSON.show()
Pointer le membre dfCSV.show()
DataFrameReader dfTEXT.show()
20
LANCER DES REQUÊTES SQL SUR UNE VUE TEMPORAIRE M.MICHRAFY
Afficher le résultat
de la requête 21
CONVERSION D’UNE COLLECTION EN UNE DATASET M.MICHRAFY
26
PERSISTER LE CONTENU D’UNE DATAFRAME M.MICHRAFY
Persister un DF Exemple
En Spark SQL, il est possible de import org.apache.spark.sql.SparkSession // importer sparkSession
persister le contenu d’une
val spark = SparkSession .builder().getOrCreate() // Créer SparkSession
dataFrame en different
format : format JSON, CSV,
PARQUET, …. // créer une dataFrame
La classe DataFrameWriter val villes = spark.createDataFrame(Seq(("Paris",2015,8),("Lyon",2015,8)
dispose des méthodes json, ,("Toulon",2016,7))).toDF("ville","annee","mois")
csv, parquet pour persister les //villes: org.apache.spark.sql.DataFrame = [ville: string, annee: int ... 1 more field]
données.
Le membre write de la // Persister le contenu en format json, csv et parquet
dataframe pointe sur un objet
de type DataFrameWriter. villes.write.json("villes.json")
villes.write.csv("villes.csv")
villes.write.parquet("villes.parquet")
27
EXÉCUTER UNE REQUÊTE SQL SUR UN FICHIER SOURCE M.MICHRAFY
28
TYPAGE D’UNE COLONNE D’UNE DATAFRAME M.MICHRAFY
Typage Exemple
En Spark SQL dispose des outils import org.apache.spark.sql.SparkSession // importer sparkSession
pour accéder à une colonne
et typer ses valeurs
import org.apache.spark.sql.functions._ // pour la fonction udf
withColumn est une méthode val spark = SparkSession .builder().getOrCreate() // Créer SparkSession
d’une dataSet permettant de
remplacer une colonne. // Charger un fichier csv
La fonction udf permet val dfcsv = spark.read.csv("VotrePathSpark/people.txt").toDF("nom", "age")
d’appliquer une opération sur // dfcsv: org.apache.spark.sql.DataFrame = [nom: string, age: string]
les éléments d’une colonne.
val toInt = udf[Int, String]( _.trim().toInt) // toInt : supprimer le blanc, et convertir en entier
29
DATAFRAME, CORRIGER LES DONNÉES M.MICHRAFY
Typage Exemple
DataFrameNaFunctions import org.apache.spark.sql.SparkSession // importer sparkSession
permet de gérer les valeurs
val spark = SparkSession .builder().getOrCreate() // Créer SparkSession
manquantes d’une
dataFrame via les fonctions :
drop, fill, replace case class Personne(ville:String, nom:String, score:Double) // case classe
val x = Seq(Personne("Paris", "Stefan", 9), Personne("Lyon", "Alain", 15), Personne("Pariss",
na une méthode de la null, 12)) // Créer une séquence de personnes
DataFrame permet
d’accéder un objet de type val dfx = spark.createDataFrame(x) // Créer une dataFrame via la séquence x
DataFrameNaFunctions.
dfx.collect() // afficher le contenu de la dataframe dfx
// Array[org.apache.spark.sql.Row] = Array([Paris,Stefan,9.0], [Lyon,Alain,15], [Pariss,null,12.0])
30
RÉFÉRENCES
31
DR MUSTAPHA MICHRAFY
CONTACT : DATASCIENCE.KM@GMAIL.COM