Une transformation étroite (filter, select, map) travaille partition par partition, sans échange de données. Une transformation large (groupBy, join, distinct, repartition) exige un shuffle : les lignes sont redistribuées entre les executors via le réseau. Le shuffle est l'opération la plus coûteuse d'un job Spark.
Exemple
df.groupBy('pays').sum('montant') # transformation large, provoque un shuffle