BDE Et Spark Cours 11
BDE Et Spark Cours 11
BDE Et Spark Cours 11
2022-2023
A propos de Moi
2022-2023
Sommaire
1. Le Big Data et L’Ecosystème Hadoop
3. La plateforme Hortonworks
1. Ambari et les différents services
2. L’accès local SSH aux serveurs et services sur les nœuds du cluster
3. Les commandes HDFS
4. La plateforme Databricks
Le Big Data et L’Ecosystème Hadoop
L’ère de la donnée en grande quantité
A chaque instant, nous produisons de la donnée :
Facebook ingère chaque jour plus de 500 Terabytes de nouvelles données dans
ses bases de données.
What is a ’
Exemple de Framework
Exemple d’architecture
Type StandAlone
Type Master - Slave - Edge
Pas d’architecture fixe (architecture évolutive)
Les ressources sont extensibles
Concept de Big Data as a Service (BDaaS)
Exemple de Big Data Cloud Providers
Plateforme de test
1. En local (terminal)
(https://github.com/KhalilFall/Introduc
tion-to-
spark_Data221/blob/main/Installation_
apache_spark_windows_linux_Mac.md)
2. IntelliJ (plugin Scala)
3. Sur le cloud (Databricks)
Introduction à Spark avec Scala
Vue 360 des services et utilisations sur une plateforme Big Data
2022-2023
Sommaire
Développé en 2001 par à l'École Polytechnique Fédérale de Lausanne (EPFL) en suisse en 2001
Première version publique sortie fin 2003
Scala combine
(basée sur des fonctions. Ex : val a = List (1,2).
En réalité List() est un fonction qui derrière, combine des
Iterable, Seq…etc Mais l’utilisateur ne voit que la fonction simple)
…etc.
Règles de base
Le caractère ‘;’ en fin d’instruction est optionnel sauf si plusieurs instructions sur une ligne
Sensible à la casse
La fonction def main(args: Array[String]) est obligatoire et représente le point d’entré du programme
Les noms de variables, d’objets, de classes, de fonctions débutent par une lettre ou un underscore. Ex: nom, _nom, _1_nom
…
Commentaires:
• // => une ligne
• /* … */ => multiple lignes
Import de modules:
• import org.me._ => importe toutes les méthodes dans me
• import org.me.porterHabit => n’importe que la méthode porterHabit
• import org.me.{seLaver, porterHabit} => n’importe que les méthodes porterHabit et seLaver
Les DataTypes
Syntaxe Générale
nomVaribale [ : DataType] = valeur
var : Pour désigner une variable mutable (dont le contenu est modifiable après assignation)
lazy val: Pour designer une variable qui n’est évaluée que lorsqu’elle est appelée
Vous avez été muté et vous êtes maintenant « scrum master ». Changer
votre profession.
Créer en une seule commande les variable nom, prenom et age. Pour des
raisons de fraudes sur l’identité de la personnes, personne ne doit
pouvoir modifier les valeurs de ces variables.
Opérateurs de comparaison
• == égalité
• != différent
• >, >= strictement supérieur et supérieur ou égal
• <, <= strictement inférieur et inférieur ou égal
Opérateurs logiques
• && ET logique
• || OU logique
• ! NOT
Opérateurs d’affectation
• =, +=, -=, *=, /=, %=
1. Combien de temps (en Jours et en Heure) il faut à un marcheur pour parcourir une distance de 750km à une vitesse de
4.8km/h
• : Vitesse = Distance/Temps et la fonction println() permet d’afficher un résultat
3. Le gouvernement a décidé d'offrir une prime de 300€ à certains fonctionnaires en fonction de leur salaire et de leur ancienneté.
Comme toutes les autres mesures prises par le gouvernement, il est difficile de comprendre à qui cette mesure s'applique.
De ce que vous avez compris, une personne peut toucher à la prime si :
Critère 1 : Elle a de d'ancienneté son salaire est à euros.
Critère 2 : Elle a d'ancienneté son salaire est compris euros.
Critère 3 : Elle a de d'ancienneté son salaire est strictement à euros à euros. C'est à
dire qu'une personne ayant plus de 10 ans d'ancienneté et un salaire entre 1500 et 2300 euros ne peut pas toucher à cette prime.
Exemple :
val tab = new Array[Int](3)
val tab2 : Array[Int] = Array(2,2,3)
val v2 = v1 7 // Array(4, 5, 6, 7)
val v4 = 3 v3 // Array(3, 4, 5, 6, 7, 8, 9)
nums.map(_ * 2) // Array(2, 4, 6)
nums.indexOf(2) // 1
nums.size // 3
num.mkString("-") // "1-2-3"
1. Créer un tableau nommé
•
Exemple :
val maListe : List[String] = List("a", "b", "c", "d", "a")
val x = List(1,2,3)
val y = 0 :: x ou 0 +: x //List(0, 1, 2, 3)
val l2 = y :+ 5 // List(0, 1, 2, 3, 4, 5)
Les Listes
Quelques fonctions natives :
Exemple :
val maSet : Set[Int] = Set(1, 8, 4, 9)
NB :
Les Set ne contiennent pas de doublons
Les Set
Ajout et suppression:
val l = z - 2 // Set(0, 1, 3, 4, 5)
Exemple :
val maTup : Tuple3[String,String,Int]=Tuple3("dia", "mor", 28)
Les Tuples
Quelques fonctions natives :
Exemple :
val maMap : Map[String, String] = Map("nom"-> "dia", "prenom"->"mor", "age"->"28")
Les Map
Quelques fonctions natives :
Filtrer les éléments de weekDayKeys1 qui sont pairs dans une variable weekDayKeys2
Pour chaque élément de weekDay, afficher la phrase 'La clef ... a pour valeur ...‘
Afficher avec println 'Les jours de la semaine sont Lundi, Mardi, Mercredi, Jeudi,
Vendredi, Samedi, Dimanche.'
Pour travailler avec des collections muables, il faut importer la collection à partir du
package scala.collection.mutable (https://www.scala-lang.org/api/2.13.6/scala/collection/mutable/index.html)
1. Soit le tableau suivant : ["pomme", "banane", , "viande", "goyave", "orange", "kaki", "pomplemousse"]
2. Ajouter les fruits "ananas" et « pastèque » respectivement au début et à la fin de la liste Fruits en utilisant
la fonction append et prepend
• Syntaxe générale :
if (1==2){
print(“true”)
}else {
print(“False”)
}
: :
for( i <- 1 to 10) { for( i <- 1 to 10 if i%2==0) {
println(i) println(i)
} }
Syntaxe générale :
( expression booléenne) {
// code
}
:
var i = 1
while( i <=10) {
println(i)
i+=1
}
Syntaxe générale :
do {
// code
} ( expression booléenne)
:
var i = 1
do {
println(i)
i+=1
} while( i <=10)
:
nomVar {
case exp1 => instruction1
case exp2 => instruction2
…
case _ => instruction par défaut
}
:
var age = 18
age match {
case 18 => println("Vous avez 18 ans.")
case x if (x < 18) => println("Vous avez moins de 18 ans.")
case 19 | 20 => println("Vous avez 19 ou 20 ans.")
case _ => println("Vous avais plus de 20 ans")
}
1. Importer scala.io.StdIn.readInt, puis demander à l'utilisateur de saisir son age dans une variable « mon_age ».
Vérifier si vous êtes un enfant, un adolescent un adulte ou un papi. En sachant que :
0 < enfant <= 9
10 <= adolescent<= 18
18 < adulte <= 60
Papi > 60
NB: Utiliser premièrement puis
2. Vérifier les parmi les années 1900 jusqu’à 2030, lesquels sont Bissextiles
Tips :
Une année est bissextile si elle est divisible par 4 et non par 100 à moins que l’année soit divisible par
400
3. Écrire un programme de dévinette en utilisantla fonction suivante
• un input renvoie toujours la même sortie
• elle n'a pas de d'effet de bord, c'est à dire qu'elle se contente juste de retourner une
valeur. En d'autres termes elle contient pas de variables mutables, ni de i/o operations, ni
de variables non local ...
• elle peut être affectée à une variable
• elle peut être considérée comme argument d'une autre fonction
• elle peut être retournée par une autre fonction
:
def sum(x: Int, y: Int) : Int = {
val result = x + y
result
}
def sum(x: Int, y: Int) : Int = x + y
def lasElement[T](l: List[T]): T = l.head
Créer une fonction qui calcule le nombre d'éléments paires dans une liste, tester avec List(3, 12, 16, 32, 54, 5, 23,
87, 98, 52, 99, 24).
Ecrire une fonction qui prend en entrée un nombre quelconque n et renvoie une liste des nombres d'Amstrong qui
sont entre 1 et n.
Un nombre est Amstrong si le nombre à la puissance sa longueur est egale à lui même
: 100 => 1 + 0 + 0 != 100 donc 100 n'est pas un nombre Amstrong.
• Ecrivez une fonction qui prend en entrée une chaine de caractère et un caractère puis
supprime le caractère spécifié dans la chaine. Si le caractère spécifié ne fait pas partie de la
chaîne, celle-ci devra être retournée intacte. Par exemple :
• purge("Bonjour","o") renverra "Bnjur"
• purge("J'ai horreur des espaces"," ") renverra "J'aihorreurdesespaces"
• purge("Moi, je m'en fous", "y") renverra "Moi, je m'en fous"
Exercices:
• Ecriver 3 fonctions anonymes qui doivent faire l'addition, la
soustraction et la multiplications de 2 nombres entiers puis metter
les dans 3 variables addition, soustraction, multiplication
• Ecriver une fonction d'ordre supérieur operation qui prend en
entrée 2 entiers et une fonction f (f est une fonction qui prend en
entrée 2 entiers et renvoie un entier) et qui renvoie la resultante de f
appliquée au 2 premiers arguments i.e f(x,y).
• Utiliser la fonction operation pour calculer 77+33, 6x7, 24-8
Introduction to Spark
Introduction à Spark
Spark avec
Scala =>
Python =>
Les Options
--name NAME :name = nom de l’application
--master TYPE :type = yarn, local, mesos…etc.
--driver-memory MEM :mem = Driver memory (default 1G)
--num-executors NUM :num = nombre d’executeurs à l’exécution
--executor-memory MEM :mem = executor memory (default 1G)
--executor-cores NUM :num = nombre de cores par executeur
Introduction à Spark
import org.apache.spark.sql.SparkSession
val spark:SparkSession = SparkSession.builder()
.master("yarn")
.appName("mon application")
.getOrCreate()
RDD
Quelques caractéristiques
Traitement en mémoire
Lazy evalution
Immuables
…
Exemple:
val fruits= Seq((1,"orange" ),(2,"pomme"),(3,"fraise"),(4,"citron"))
val fruitRDD = spark.sparkContext.parallelize(fruits )
A partir d’une
("cheminVersFichier")
Créer une variable à partir de la collection partagée dans
codeshare
Créer la variable contenant la variable définie
précédemment avec le syntaxe
( )
En utilisant la fonction count, donner le nombre total
d'enregistrements(commandes) contenus dans .
En utilisant distinct, donner le nombre dinctinct de commandes
effectués.
Afficher les 5 premiers éléments de avec la fonction take(5)
A partir d’un RDD, retourne un autre RDD après un traitement
map(func)
filter(func)
flatMap(func)
groupByKey(([numPartitions])
reduceByKey(func, [numPartitions])
sortByKey([ascending], [numPartitions])
join(otherDataset, [numPartitions ])
coalesce(numPartitions)
repartition(numPartitions)
https://spark.apache.org/docs/latest/rdd-programming-guide.html#transformations
A partir d’un RDD retourne une valeur
(func)
()
()
()
()
(func)
https://spark.apache.org/docs/latest/rdd-programming-guide.html#actions
Sélectionner des colonnes
Pour un RDD de String avec un delimiteur d=, ou ; ou | ou …
NB: Penser à transfomer votre RDD initial en RDD de collection plus facile à traiter
Exercices:
En utilisant rdd1,
• Créer une variable contenant les valeurs contenues dans category
• Créer une seconde variable contenant les valeurs de nom_client et sex
• Afficher les 5 premiers lignes de ces variables
Renommer ou faire des opérations sur une colonne
Transformer une colonne
NB: transformation est une fonction quelconque qui peut s'appliquer sur line.
Exercices:
• Créer une variable contenant un RDD des années des différents commandes.
• Créer une fonction qui prend en entrée une chaine au format 'yyyy-MM-
dd' puis renvoie 'yyyy'
• Créer une variable , puis en utilisant la fonction pour ajouter une
nouvelle information dans rdd1
• Créer une fonction qui prend en entrée un argument de type Any
et un argument de type Any également puis renvoie si value est null sinon
renvoie value
• Créer une variables qui va se baser sur et remplace les valeurs
null de la colonne (pos 5) par 0.
Appliquer des filtres en utilisant filter
Exercices:
• Afficher et compter les personnes qui ont commmandé 1 seul produit.
• Afficher et compter les personnes qui ont commandé des bananes.
• Afficher et compter les personnes qui ont commander des produits coutant plus de
50.
Aggrégations
Les fonctions pouvant être utilisées:
Exercices:
• Déterminer le nombre total de commandes par date. Pour cela, il faut transformer le
rdd initial et récupérer que le couple date et quantite, après appliquer un
reduceByKey
• Afficher la quantité totale commander par produit et par client.
Repartitionner un dataframe
rdd1.coalesce(n)
rdd2.repartition(n)
DataFrame
Lecture et Ecriture de
plusieurs formats de
données autorisées
A partir d’une
A partir d’un
A partir d’une s
plats_dataframe.show(false)
’
val plats_list = List(("Thieb djeune", "2000"), ("Mafe", "3000"), ("Soupou kandja", "3500"))
val plats_list = List(("Thieb djeune", "2000"), ("Mafe", "3000"), ("Soupou kandja", "3500"))
….
df.show(nbLignes, false/true)
df.printSchema
df.summary()
Sélectionner des colonnes
select avec les noms de colonnes en String
df.select("colonne1", "colonne2", …)
df.select(col("colonne1"), col("colonne2"), …)
selectExpr
df.selectExpr("colonne1", "colonne2", …)
Exercices:(https://spark.apache.org/docs/latest/api/java/org/apache/spark/sql/functions.html )
• Afficher, à partir de , les colonnes et (en le mettant en
majuscule avec la fonction ).
Renommer ou faire des opérations sur une colonne
Renommer
df.withColumnRenamed("oldCol", "newCol")
df.withColumn("newColonne", opérations)
df.withColumn("colonne1", opérations)
Exercices:
• Renommer la colonne en .
• Remplacer le contenu de la colonne prix par le prix réel c’est-à-dire le produit des
colonnes quantité et prix puis afficher.
• Créer une nouvelle colonne qui est la résultante du produit des colonnes
et .
Appliquer des filtres en utilisant filter ou where
En mode Sql
df.where("colonne1 != 0")
En mode DataFrame
Exercices:
• Afficher les personnes qui on fait 1 seul produit.
• Afficher les personnes qui ont commander de la banane. (Avec les 2 méthodes)
• Afficher les personnes qui ont commander des produits coutant plus de 50.
Nettoyage des valeurs Null
na.fill
na.drop
df.drop(Seq("colonne1", "colonne2"))
na.replace
Exercices:
• Remplacer les valeurs null de la colonne quantite par 1.
• Remplacer les valeurs h par 1 et f par 0.
When - otherwise
Exercices:
• Créer une colonne libelle_sex, qui résulte de la colonne sex en convertissant les
valeurs h par homme et f par femme.
Aggrégations
Syntaxe:
Exercices:
• Déterminer le nombre total de commandes par date.
• Afficher la quantité totale commander par produit et par client puis trier par quantité
totale.
• Afficher le nombre de produit total et le nombre de produit distinct par client.
Les types de jointures
Les types de jointures
Exercices:
Exercices:
• Créons une fonction qui prend en entrée un Array de String et renvoie au hazard un
élément du Array (utiliser scala.util.Random.nextInt)
• Définissez un UDF du nom de .
• Créer une Array contenant de bons plats.
• Ajouter une nouvelle colonne, dans qui contient les éléments du Array
générés au hazard (en utilisant le UDF).
Quelques fonctions sur les dates
current_date () : Column Returns the current date as a date column.
date_format(dateExpr: Column, format: Converts a date/timestamp/string to a value of string in the format
String): Column specified by the date format given by the second argument.
to_date(e: Column, fmt: String): Column Converts the column into a `DateType` with a specified format
add_months(startDate: Column, numMonths:
Returns the date that is `numMonths` after `startDate`.
Int): Column
date_add(start: Column, days: Int): Column
Returns the date that is `days` days after `start`
date_sub(start: Column, days: Int): Column
datediff(end: Column, start: Column): Column Returns the number of days from `start` to `end`.
year(e: Column): Column Extracts the year as an integer from a given date/timestamp/string
month(e: Column): Column Extracts the month as an integer from a given date/timestamp/string
Extracts the day of the week as an integer. Ranges from 1 for a Sunday
dayofweek(e: Column): Column
through to 7 for a Saturday
dayofmonth(e: Column): Column Extracts the day of the month as an integer
dayofyear(e: Column): Column Extracts the day of the year as an integer from a given
Returns the last day of the month which the given date belongs to. For
last_day(e: Column): Column example, input "2015-07-27" returns "2015-07-31" since July 31 is the
last day of the month in July 2015.
Exercices:
• Créons une nouvelle colonne qui calcule le nombre de jour entre
la colonne date et la date d'aujourd'hui.
Repartitionner un dataframe
df.coalesce(n)
df.repartition(n)
Créer un View
df. createOrReplaceTempView("nomView")
Exemple:
Nous pouvons faire un Select … from avec des filtres
spak.sql("select * from nomView where quantite > 50").show(false)
Nous pouvons agréger les données
Nous pouvons faire des jointures
…….