J'ai du mal à trouver dans la documentation Spark des opérations qui provoquent un brassage et des opérations qui ne le font pas. Dans cette liste, lesquelles provoquent un remaniement et lesquelles ne provoquent pas?
La carte et le filtre ne le font pas. Cependant, je ne suis pas sûr avec les autres.
map(func)
filter(func)
flatMap(func)
mapPartitions(func)
mapPartitionsWithIndex(func)
sample(withReplacement, fraction, seed)
union(otherDataset)
intersection(otherDataset)
distinct([numTasks]))
groupByKey([numTasks])
reduceByKey(func, [numTasks])
aggregateByKey(zeroValue)(seqOp, combOp, [numTasks])
sortByKey([ascending], [numTasks])
join(otherDataset, [numTasks])
cogroup(otherDataset, [numTasks])
cartesian(otherDataset)
pipe(command, [envVars])
coalesce(numPartitions)
En fait, il est extrêmement facile de le savoir, sans la documentation. Pour n’importe laquelle de ces fonctions, créez simplement un RDD et appelez la chaîne de débogage. En voici un exemple: vous pouvez faire le reste vous-même.
scala> val a = sc.parallelize(Array(1,2,3)).distinct
scala> a.toDebugString
MappedRDD[5] at distinct at <console>:12 (1 partitions)
MapPartitionsRDD[4] at distinct at <console>:12 (1 partitions)
**ShuffledRDD[3] at distinct at <console>:12 (1 partitions)**
MapPartitionsRDD[2] at distinct at <console>:12 (1 partitions)
MappedRDD[1] at distinct at <console>:12 (1 partitions)
ParallelCollectionRDD[0] at parallelize at <console>:12 (1 partitions)
Comme vous pouvez le constater, distinct
crée un mélange. Il est également particulièrement important de connaître cette méthode plutôt que de la documenter, car il existe des situations dans lesquelles un mélange aléatoire sera requis ou non requis pour une fonction donnée. Par exemple, rejoindre nécessite généralement un mélange, mais si vous joignez deux RDD, cette branche provenant de la même étincelle de RDD peut parfois éviter le mélange.
Voici une liste des opérations qui pourraient provoquer un remaniement:
join
: partition de hachage
leftOuterJoin
: partition de hachage
rightOuterJoin
: partition de hachage
groupByKey
: partition de hachage
reduceByKey
: partition de hachage
combineByKey
: partition de hachage
sortByKey
: partition partition
intersection
: partition de hachage
Source: Analyse de données volumineuses avec Spark et Scala , Optimisation avec des partitions, Coursera
Cela pourrait être utile: https://spark.Apache.org/docs/latest/programming-guide.html#shuffle-operations
ou ceci: http://www.slideshare.net/SparkSummit/dev-ops-training , en commençant par la diapositive 208
de la diapositive 209: "Les transformations qui utilisent 'numPartitions' comme distinct vont probablement se mélanger"
Voici la déclaration générale sur le remaniement des transformations.
Les transformations pouvant provoquer un mélange comprennent les opérations repartition comme
repartition
etcoalesce
, ‘opérations ByKey (sauf pour compter) commegroupByKey
etreduceByKey
, et join opérations commecogroup
etjoin
.