Académique Documents
Professionnel Documents
Culture Documents
DR MUSTAPHA MICHRAFY
CONTACT : DATASCIENCE.KM@GMAIL.COM
CONTEXTE M.MICHRAFY
2
PLAN M.MICHRAFY
1. Contexte
2. Objectif et prérequis
3. Spark Définition et motivations
4. Positionnement de Spark dans l’eco-systeme Big Data
5. Composants de spark
6. Spark driver et workers
7. Apache Spark : vue logique et APIs
8. Vue globale sur les API Spark : dépendance et interaction
9. RDD, caractéristiques, création et Operations
10.Opérations de type transformation et action
3
OBJECTIF ET PRÉREQUIS M.MICHRAFY
Objectif Prérequis
Cette étude vise à mettre en pratique Spark • Connaissance de l’approche objet
pas à pas. Il s’agit d’explorer les opérations • Connaissance de la programmation
(transformations et actions) relatives à la fonctionnelle
structure résiliente « RDD ». • Connaissance du langage Scala
4
SPARK DÉFINITION ET MOTIVATIONS M.MICHRAFY
5
POSITIONNEMENT DE SPARK DANS L’ECO-SYSTEME BIG DATA M.MICHRAFY
Stockage
6
COMPOSANTS DE SPARK M.MICHRAFY
Worker Node
Executor
Task Task
Spark driver
Worker Node
SparkContext Cluster Manager
Executor
Task Task
Worker Node
Executor
Task Task
7
M.MICHRAFY
SPARK DRIVER ET WORKERS
Spark driver
SparkContext
• Un programme Spark est composé de deux programmes :
8
M.MICHRAFY
APACHE SPARK : VUE LOGIQUE ET APIS
Spark SQL est un module dédié au traitement SparkR est un package R offrant une interface
des données structurées avec une syntaxe légère pour utiliser Spark à partir de R. Dans
similaire à SQL. Il permet d’extraire, transformer Spark 2.0.2, SparkR fournit une implémentation Spark ML est une librairie
et charger des données sous différents formats de la Dataframe distribuée supportant des dédiée aux méthodes
(CSV, JSON, Parquet, base de données) et les opérations telles que la sélection, le filtrage, d’apprentissage distribués :
exposer pour des requêtes ad-hoc. l'agrégation. SparkR offre aussi des algorithmes Classification
d’apprentissages distribués. Clustering
Spark GraphX est dédié au traitement et à la
parallélisation de graphes. Ce module offre des Spark Streaming est dédié au traitement Régression
opérateurs et des algorithmes pour le temps-réel des données en flux. Il offre un Filtrage collaboratif
traitement des graphes. GraphX étend les RDD mode de traitement en micro-batch et Réduction de dimension
de Spark via la Resilient Distributed Dataset supportant différentes sources de données
Graph (RDDG) (Kafka, Flume, Kinesis ou TCP sockets …). 9
M.MICHRAFY
VUE GLOBALE SUR LES API SPARK : DÉPENDANCE ET INTERACTION
Graph RDD
RDD Dataframe
GraphRDD
Graph RDD
RDD RDD Dataframe
Dataframe
10
M.MICHRAFY
RDD, CARACTÉRISTIQUES, CRÉATION ET OPERATIONS (1)
11
M.MICHRAFY
RDD, CARACTÉRISTIQUES, CRÉATION ET OPERATIONS (2)
In-Memory Immutable
Lazy
evaluated
Resilient
RDD
Parallele
Cacheable
Partitioned Typed
12
M.MICHRAFY
(*) : Les exemple du code ont été exécutés avec spark-shell, version 2.0.2 13
OPÉRATION DE TRANSFORMATION : MÉTHODE MAP M.MICHRAFY
Exemple
// créer un RDD
val x = sc.parallelize(List( 7, 10, 12, 17, 19), 2) // x: org.apache.spark.rdd.RDD[Int] = ParallelCollectionRDD[2] at parallelize at <console>:24
// definir une fonction f
val f = (a:Int) => (a/2, a%2) // f: Int => (Int, Int) = <function1>
// définir une fonction g
val g = (a:Int) => (a*100.0)/20 // g: Int => Double = <function1>
// applique map avec f et g
val zf = x.map(f) // zf: org.apache.spark.rdd.RDD[(Int, Int)] = MapPartitionsRDD[3] at map at <console>:28
val zg = x.map(g) // zg: org.apache.spark.rdd.RDD[Double] = MapPartitionsRDD[4] at map at <console>:28
// afficher zf et zg
zf.collect() // res1: Array[(Int, Int)] = Array((3,1), (5,0), (6,0), (8,1), (9,1))
zg.collect() // res2: Array[Double] = Array(35.0, 50.0, 60.0, 85.0, 95.0) 14
OPÉRATION TERMINALE : MÉTHODE REDUCE M.MICHRAFY
Exemple
// créer une RDD comportant les éléments de 1 à 10
val x = sc.parallelize(1 to 10, 3) //x: org.apache.spark.rdd.RDD[Int] = ParallelCollectionRDD[5] at parallelize at <console>:24
15
OPÉRATION DE TERMINALE : MÉTHODE COUNT M.MICHRAFY
Exemple
// créer une RDD comportant les éléments de 1 à 10
val x = sc.parallelize(1 to 10, 3) //x: org.apache.spark.rdd.RDD[Int] = ParallelCollectionRDD[6] at parallelize at <console>:24
val y = sc.parallelize(List((1,1), (1,2), (3,5), (3,7), (8,9), (8,13))) // y: org.apache.spark.rdd.RDD[(Int, Int)] = ParallelCollectionRDD[7] at parallelize at <console>:24
Exemple
// créer une x ( chaque entier et ses diviseurs)
val x = sc.parallelize(List((10,2),(10,5), (14,2), (14,7), (30,2), (30,3), (30,5)))
//Sortie : x: org.apache.spark.rdd.RDD[(Int, Int)] = ParallelCollectionRDD[21] at parallelize at <console>:24
val r = x.countByKey()
// Sortie : r: scala.collection.Map[Int,Long] = Map(30 -> 3, 14 -> 2, 10 -> 2)
17
OPÉRATION DE TERMINALE : MÉTHODE FIRST M.MICHRAFY
C’est une opération terminale API : scala, Classe : RDD, Une exception se déclenche si
Package : org.apache.spark l’appel de first() se fait sur une RDD
source sans élément.
Sortie : le premier élément de la RDD de type T
Exemple
// créer une RDD comportant les éléments de 1 à 10
val x = sc.parallelize(1 to 10, 3) //x: org.apache.spark.rdd.RDD[Int] = ParallelCollectionRDD[8] at parallelize at <console>:24
val y = sc.parallelize(List((1,1), (1,2), (3,5), (3,7), (8,9))) // y: org.apache.spark.rdd.RDD[(Int, Int)] = ParallelCollectionRDD[9] at parallelize at <console>:24
val z = sc.parallelize(List())
Exemple
// créer une RDD comportant les éléments de 1 à 10
val x = sc.parallelize(1 to 10, 3) // x: org.apache.spark.rdd.RDD[Int] = ParallelCollectionRDD[10] at parallelize at <console>:24
val z = sc.parallelize(List()) // z: org.apache.spark.rdd.RDD[Nothing] = ParallelCollectionRDD[11] at parallelize at <console>:24
Exemple 1 2
// créer une RDD comportant les éléments de 1 à 10 val z = parallelize(List("La meilleure facon de predire l’avenir est de le creer", "Celui qui
val x = sc.parallelize(List((1,2),(3,5),(8,10)) veut reussir trouve un moyen", "Celui qui veut rien faire trouve une excuse"))
Exemple
// créer un RDD
val x = sc.parallelize(List( 7, 10, 12, 17, 19), 2) // x: org.apache.spark.rdd.RDD[Int] = ParallelCollectionRDD[0] at parallelize at <console>:24
// definir une fonction f
val f = (a:Int) => (a%2==0) // f: Int => Boolean = <function1>
// définir une fonction g
Val g = (a:Int) => (a>50) // g: Int => Boolean = <function1>
// applique filter avec f et g
val zf = x.map(f) // zf: org.apache.spark.rdd.RDD[Boolean] = MapPartitionsRDD[1] at map at <console>:28
val zg = x.map(g) // zg: org.apache.spark.rdd.RDD[Boolean] = MapPartitionsRDD[2] at map at <console>:28
// afficher zf et zg
zf.collect() // res0: Array[Boolean] = Array(false, true, true, false, false)
Zg.collect() // res2: Array[Boolean] = Array(false, false, false, false, false) 21
OPÉRATION DE TRANSFORMATION : MÉTHODE SAMPLE M.MICHRAFY
Exemple
// créer un RDD de 100 entiers
val x = sc.parallelize(1 to 100, 2) // x: org.apache.spark.rdd.RDD[Int] = ParallelCollectionRDD[3] at parallelize at <console>:24
Exemple
// créer un RDD de 100 entiers
val x = sc.parallelize(1 to 100, 2) // x: org.apache.spark.rdd.RDD[Int] = ParallelCollectionRDD[7] at parallelize at <console>:24
val smpl1take = x.takeSample(true, 10, 7) // smpl1take: Array[Int] = Array(19, 29, 64, 52, 74, 87, 93, 46, 27, 31)
val smpl2take = x.takeSample(false, 10, 7) // smpl2take: Array[Int] = Array(41, 80, 72, 24, 90, 100, 56, 87, 50, 78)
23
OPÉRATION TERMINALE: MÉTHODE TAKEORDERED M.MICHRAFY
Exemple
sc.parallelize(Seq(6, 8, 9, 1, 2, 3)).takeOrdered(3) // res1: Array[Int] = Array(1, 2, 3)
24
OPÉRATION TERMINALE : MÉTHODE FOLD M.MICHRAFY
Exemple
val x = sc.parallelize( 1 to 6, 2) // x: org.apache.spark.rdd.RDD[Int] = ParallelCollectionRDD[0] at parallelize at <console>:24
// zeroValue : 0
25
OPÉRATION DE TRANSFORMATION : MÉTHODE MAPPARTITIONSWITHINDEX M.MICHRAFY
Exemple
// définir un RDD ( 1 …10) avec 3 partitions
val x = sc.parallelize(1 to 10, 3) // x: org.apache.spark.rdd.RDD[Int] = ParallelCollectionRDD[12] at parallelize at <console>:24
// affiche une liste de tuple, chaque tuple est composé de l'index de la partition et la valeur de l'élément.
def f[T](i:Int, p:Iterator[T]) : Iterator[(Int,T)] = p.map(w => (i,w)) // f: [T](i: Int, p: Iterator[T])Iterator[(Int, T)]
26
OPÉRATION TERMINALE : MÉTHODE AGGREGATE M.MICHRAFY
Objectifs Signature
Agréger les données en deux étapes. Il def aggregate[U](zeroValue: U)(seqOp: (U, T) ⇒ U,
s’agit d’une opération de type Action combOp: (U, U) ⇒ U)(implicit arg0: ClassTag[U]): U
L’étape 1 consiste à appliquer seqOp par
partition API : scala, Classe : rdd, Package : org.apache.spark
L’étape 2 consiste à appliquer combOp Entrée
aux résultats de l’étape 1 - zeroValue : la valeur initiale de l’accumulateur de type U
- seqOp : c’est une fonction associative qui sera appliquée sur chaque partition
- comOp : c’est une fonction associative qui s’applique sur les résulats données par seqOp.
Sortie : une valeur de retour de type U
Exemple
val x = sc.parallelize( 1 to 6, 2) // x: org.apache.spark.rdd.RDD[Int] = ParallelCollectionRDD[0] at parallelize at <console>:24
// affiche une liste de tuple, chaque tuple est composé de l'index de la partition et la valeur de l'élément.
def f[T](i:Int, p:Iterator[T]) : Iterator[(Int,T)] = p.map(w => (i,w)) // f: [T](i: Int, p: Iterator[T])Iterator[(Int, T)]
Exemple
1 2
// créer une RDD constitué d’une liste de fruits // appliquer mapValues sur y avec la fonction f
val x = sc.parallelize(List("Abricot", "Cerise", "Nectarine", "Noisette", "Kiwi")) val z = y.mapValues(f)
x: org.apache.spark.rdd.RDD[String] = ParallelCollectionRDD[31] at parallelize //Sortie : z: org.apache.spark.rdd.RDD[(String, (Int, Int))] =
at <console>:24 MapPartitionsRDD[33] at mapValues at // <console>:30
Exemple
// définir un RDD ( 1 …10) avec 2 partitions
val x = sc.parallelize(1 to 10, 2) // x: org.apache.spark.rdd.RDD[Int] = ParallelCollectionRDD[14] at parallelize at <console>:24
29
OPÉRATION TERMINALE : MÉTHODE FOREACH M.MICHRAFY
Exemple
// définir des RDD
val x = sc.parallelize(1 to 5, 2) // x: org.apache.spark.rdd.RDD[Int] = ParallelCollectionRDD[15] at parallelize at <console>:24
val y = sc.parallelize(List("Banane", "Kiwi", "Cerise", "Orange", "Fraise"),2)
val z = y.zip(x) // z: org.apache.spark.rdd.RDD[(String, Int)] = ZippedPartitionsRDD2[17] at zip at <console>:28
30
OPÉRATION DE TRANSFORMATION : MÉTHODE COLLECT AVEC DES ARGUMENTS M.MICHRAFY
Exemple
// créer une rdd avec des éléments de 1 à 10
val sample = sc.parallelize(1 to 10) // sample: org.apache.spark.rdd.RDD[Int] = ParallelCollectionRDD[18] at parallelize at <console>:24
Exemple
// créer un rdd avec les éléments : 1,1,2,3,4,5,5
val z = sc.parallelize(List(1,1,2,3,4,5,5)) // z: org.apache.spark.rdd.RDD[Int] = ParallelCollectionRDD[23] at parallelize at <console>:24
// appliquer la méthode distinct sur la rdd z
val zsd = z.distinct() // zsd: org.apache.spark.rdd.RDD[Int] = MapPartitionsRDD[26] at distinct at <console>:26
// regrouper le resultat dans un tableau
zsd.collect() // res12: Array[Int] = Array(4, 1, 5, 2, 3)
val l = List(List(1,2),List(3,4), List(4,3), List(1,2), List(1,2,3,4)) // l: List[List[Int]] = List(List(1, 2), List(3, 4), List(4, 3), List(1, 2), List(1, 2, 3, 4))
val zobj = sc.parallelize(l) // zobj: org.apache.spark.rdd.RDD[List[Int]] = ParallelCollectionRDD[27] at parallelize at <console>:26
// observer le resultat
val zobjsd = zobj.distinct() // zobjsd: org.apache.spark.rdd.RDD[List[Int]] = MapPartitionsRDD[30] at distinct at <console>:28
zobjsd.collect() // res14: Array[List[Int]] = Array(List(3, 4), List(1, 2, 3, 4), List(4, 3), List(1, 2))
32
OPÉRATION DE TRANSFORMATION : MÉTHODE UNION M.MICHRAFY
Exemple
// créer les rdd avec les éléments : 1 to 10, et 5 to 15
val x = sc.parallelize(1 to 10) // x: org.apache.spark.rdd.RDD[Int] = ParallelCollectionRDD[31] at parallelize at <console>:24
val y = sc.parallelize(5 to 15) // y: org.apache.spark.rdd.RDD[Int] = ParallelCollectionRDD[32] at parallelize at <console>:24
33
OPÉRATION DE TRANSFORMATION : MÉTHODE INTERSECTION M.MICHRAFY
Exemple
// créer deux rdds
val x = sc.parallelize(List(1 , 1, 2, 3, 4, 7)) // x: org.apache.spark.rdd.RDD[Int] = ParallelCollectionRDD[38] at parallelize at <console>:24
val y = = sc.parallelize(List(1, 1, 4, 4, 5, 6)) // y: org.apache.spark.rdd.RDD[Int] = ParallelCollectionRDD[39] at parallelize at <console>:24
34
OPÉRATION DE TRANSFORMATION : MÉTHODE SUBTRACT M.MICHRAFY
Exemple 2
1
// créer les 2 rdds // créer une RDD
val x = sc.parallelize(1 to 5, 2) val z = sc.parallelize(List("A","B","D","E"),2)
val y = sc.parallelize(3 to 7, 2)
// appliquer la méthode subtract sur x et z
x.collect() // res18: Array[Int] = Array(1, 2, 3, 4, 5) // cette instruction génère une erreur
y.collect() // res19: Array[Int] = Array(3, 4, 5, 6, 7) val t = x.subtract(z)
error: type mismatch;
// appliquer la méthode subtract et generer la RDD s
found : org.apache.spark.rdd.RDD[String]
val s = x.subtract(y)
required: org.apache.spark.rdd.RDD[Int]
val t = x.subtract(z)
// afficher les éléments
s.collect() // res20: Array[Int] = Array(2, 1)
35
OPÉRATION DE TRANSFORMATION : MÉTHODE ZIP M.MICHRAFY
Exemple 1 Exemple 2
// créer les deux rdds // créer deux rdds
val key = sc.parallelize(1 to 5, 2) val value_nes = sc.parallelize(11 to 16, 2 )
val value = sc.parallelize(11 to 15, 2 ) val value_nps = sc.parallelize(11 to 15, 3 )
36
OPÉRATION DE TRANSFORMATION : MÉTHODE GROUPBY M.MICHRAFY
Exemple 1 2
// créer la rdd de type (Int) avec 10 partitions // appliquer la groupBy , avec f, sur les éléments de y
val x = sc.parallelize(1 to 20, 10) val z = y.groupBy(f)
// faire une selection aléatoire dans les éléments de x // appliquer groupBy, avec g, sur les éléments de y
val y = x.sample(false, 0.1, 19) val s = y.groupBy(g)
Exemple
// créer la rdd de type (k,v) avec deux partitions
val x = sc.parallelize(List((1,1),(11,2),(11,6),(2,8),(3,5),(3,7)),2) // x: org.apache.spark.rdd.RDD[(Int, Int)] = ParallelCollectionRDD[67] at parallelize at <console>:24
38
OPÉRATION DE TRANSFORMATION : MÉTHODE REDUCEBYKEY M.MICHRAFY
Exemple
// créer la rdd de type (k,v) avec deux partitions
val t = Seq((1,1),(1,8), (2,7), (2,9), (3,13), (3, 10))
val x = sc.parallelize(t, 2) // // x: org.apache.spark.rdd.RDD[(Int, Int)] = ParallelCollectionRDD[4] at parallelize at <console>:24
x.collect() // // res2: Array[(Int, Int)] = Array((1,1), (1,8), (2,7), (2,9), (3,13), (3,10))
// afficher les résultats
y.collect() // res3: Array[(Int, Int)] = Array((2,16), (1,9), (3,23))
39
OPÉRATION DE TRANSFORMATION : MÉTHODE AGGREGATEBYKEY M.MICHRAFY
Exemple
// créer la rdd de type (k,v) avec deux partitions
val x = sc.parallelize(List(("Bannane", 4),("Fraise", 1),("Bannane", 3),("Kiwi", 2),("Fraise", 2),("Orange", 5),("Orange",6),("Raisin",4)),2)
// Pour chaque élément de la RDD x, afficher sa partition et sa valeur
x.mapPartitionsWithIndex((i,p) => p.map(w => (i,w))).collect()
// res28: Array[(Int, (String, Int))] = Array((0,(Bannane,4)), (0,(Fraise,1)), (0,(Bannane,3)), (0,(Kiwi,2)), (1,(Fraise,2)), (1,(Orange,5)), (1,(Orange,6)), (1,(Raisin,4)))
// créer deux fonctions seqOp et combOp
val seqOp = (a:Int, b:Int) => Math.max(a,b) // seqOp: (Int, Int) => Int = <function2>
val combOp = (a:Int, b:Int) => a + b // combOp: (Int, Int) => Int = <function2>
// appliquer la méthode aggregateByKey
val y = x.aggregateByKey(0)(seqOp, combOp) // y: org.apache.spark.rdd.RDD[(String, Int)] = ShuffledRDD[76] at aggregateByKey at <console>:30
Exemple 1 Exemple 2
// créer une rdd de type (k,v) case class A(tag:String, load:Int) extends Ordered[A] {
val x = sc.parallelize(List(("B", 4),("K", 2),("F", 2),("O", 5),("R",4)),3) def compare( a:A ) = tag.compareTo(a.tag)
}
// appliquer la méthode sortByKey // créer une rdd de type (k,v)
val yas = x.sortByKey(true) val xls = List( A("w",50), A("v",2), A("l",7), A("s",6))
val yde = x.sortByKey(false) val xlsrdd = sc.parallelize(xls,2)
val v = sc.parallelize(1 to 4,2)
// afficher les résultats val xx = xlsrdd.zip(v)
yas.collect() // res30: Array[(String, Int)] = Array((B,4), (F,2), (K,2), (O,5), (R,4)) // appliquer la méthode sortByKey
yde.collect() // res32: Array[(String, Int)] = Array((R,4), (O,5), (K,2), (F,2), (B,4)) val yy = xx.sortByKey(true)
// afficher les résultats
yy.collect() // Array[(A, Int)] = Array((A(l,7),3), (A(s,6),4), (A(v,2),2), (A(w,50),1))
41
OPÉRATION DE TRANSFORMATION : MÉTHODE JOIN M.MICHRAFY
Exemple
// créer des rdd de type (k,v)
val l1 = List(("A",1),("B",2),("C",3),("D",5),("E",1))
Val l2 = List(("A",2),("E",2),("C",5),("D",5),("G",1))
val x = sc.parallelize(l1,2) //x: org.apache.spark.rdd.RDD[(String, Int)] = ParallelCollectionRDD[7] at parallelize at <console>:26
val y = sc.parallelize(l2, 2) // y: org.apache.spark.rdd.RDD[(String, Int)] = ParallelCollectionRDD[8] at parallelize at <console>:26
Exemple
// créer deux RDD
val x = sc.parallelize( 1 to 5, 2) // x: org.apache.spark.rdd.RDD[Int] = ParallelCollectionRDD[12] at parallelize at <console>:24
val y = sc.parallelize(List(("A",2),("E",2),("C",5)), 2) // y: org.apache.spark.rdd.RDD[(String, Int)] = ParallelCollectionRDD[13] at parallelize at <console>:24
// afficher les éléments de z // res4: Array[(Int, (String, Int))] = Array((1,(A,2)), (2,(A,2)), (1,(E,2)), (1,(C,5)), (2,(E,2)), (2,(C,5)), (3,(A,2)),
z.collect() // (4,(A,2)), (5,(A,2)), (3,(E,2)), (3,(C,5)), (4,(E,2)), (4,(C,5)), (5,(E,2)), (5,(C,5)))
43
OPÉRATION DE TRANSFORMATION : MÉTHODE COGROUP M.MICHRAFY
Exemple
// créer deux RDD de type clé-valeur
val x = sc.parallelize(List(("A",1), ("A",2),("C",5), ("D",10),("D",1)), 2)
val y = sc.parallelize(List(("A",3), ("B",3), ("B",6), ,("C",7)), 2)
// regrouper par clé
val z = x. cogroup(y) // RDD[(String, (Iterable[Int], Iterable[Int]))] = MapPartitionsRDD[18] at cogroup at <console>:28
// comparer le nombre des clés distinct avec celui du nombre d’éléments de z
x.map(w => w._1).union(y.map(w => w._1)).distinct().count() == z.count() // res5: Boolean = true
// calculer le nombre des éléments de z
z.count() // res6: Long = 4
// afficher les éléments de z
z.collect() // res7: Array[(String, (Iterable[Int], Iterable[Int]))] = Array((B,(CompactBuffer(),CompactBuffer(3, 6))), (D,(CompactBuffer(10,1),CompactBuffer())),
// (A,(CompactBuffer(1, 2),CompactBuffer(3))), (C,(CompactBuffer(5),CompactBuffer(7))))
44
OPÉRATION DE TRANSFORMATION : MÉTHODE COALESCE M.MICHRAFY
Exemple
// créer une RDD avec 50 partitions
val x = sc.parallelize( 1 to 1000, 50) // x: org.apache.spark.rdd.RDD[Int] = ParallelCollectionRDD[25] at parallelize at <console>:24
// appliquer coalesce
val y = x. coalesce(10, true) // y: org.apache.spark.rdd.RDD[Int] = MapPartitionsRDD[29] at coalesce at <console>:26
val z = x.coalesce(3, false) // z: org.apache.spark.rdd.RDD[Int] = CoalescedRDD[30] at coalesce at <console>:26
Exemple
// créer une RDD avec 50 partitions
val x = sc.parallelize( 1 to 1000, 50) // x: org.apache.spark.rdd.RDD[Int] = ParallelCollectionRDD[31] at parallelize at <console>:24
// appliquer repartition
val y = x. repartition(10) // y: org.apache.spark.rdd.RDD[Int] = MapPartitionsRDD[35] at repartition at <console>:26
46
OPÉRATION DE TRANSFORMATION : MÉTHODE SAVEASTEXTFILE M.MICHRAFY
Exemple
// créer une RDD avec 50 partitions
val x = sc.parallelize( 1 to 20, 3)
val y = sc.parallelize(List((1,2),(3,5),(6,7),(8,10),(11,15),(18,20)), 2)
47
DR MUSTAPHA MICHRAFY
CONTACT : DATASCIENCE.KM@GMAIL.COM