Ceci est mon exemple.Comment distribuer efficacement et utiliser des partitions dans l'étincelle?
val arr = Array((1,2), (1,3), (1,4), (2,3), (4,5))
val data = sc.parallelize(arr, 5)
data.glom.map(_length).collect
Array[Int] = Array(1, 1, 1, 1, 1)
val agg = data.reduceByKey(_+_)
agg.glom.map(_.length).collect
Array[Int] = Array(0, 1, 1, 0, 1)
val fil = agg.filter(_._2 < 4)
fil.glom.map(_.length).collect
Array[Int] = Array(0, 0, 1, 0, 0)
val sub = data.map{case(x,y) => (x, (x,y))}.subtractByKey(fil).map(_._2)
Array[(Int, Int)] = Array((1,4), (1,3), (1,2), (4,5))
sub.glom.map(_.length).collect
Array[Int] = Array(0, 3, 0, 0, 1)
Ce que je me demande, c'est de répartir également les partitions.
La variable data
se compose de cinq partitions, toutes les données étant partitionnées de manière égale.
ex)par1: (1,2)
par2: (1,3)
par3: (1,4)
par4: (2,3)
par5: (4,5)
Après plusieurs transformation operation
, attribués à la variable sub
Seulement deux des cinq partitions sont utilisées.
La variable sub
se compose de cinq partitions, mais toutes les données ne sont pas partitionnées de manière égale.
ex)par1: empty
par2: (1,2),(1,3),(1,4)
par3: empty
par4: empty
par5: (4,5)
Si j'ajoute une autre transformation operation
à la variable sub
, il y aura 5 partitions disponibles, mais seulement deux partitions seront utilisées pour l'opération.
ex)sub.map{case(x,y) => (x, x, (x,y))}
Donc, je veux utiliser toutes les partitions disponibles lorsque les données sont exploitées. J'ai utilisé la méthode repartition
, mais ce n'est pas moins cher. Donc, je cherche un moyen judicieux d'utiliser autant de partitions que possible.
Y a-t-il un bon moyen?
Merci pour votre réponse! –