Comment puis-je forcer Spark à exécuter un appel à la carte, même s'il pense qu'il n'a pas besoin d'être exécuté en raison de son évaluation paresseuse?
J'ai essayé de mettre cache()
avec l'appel de carte mais cela ne fait toujours pas l'affaire. Ma méthode de carte télécharge en fait les résultats sur HDFS. Donc, ce n'est pas inutile, mais Spark le pense.
Réponse courte:
Pour forcer Spark pour exécuter une transformation, vous devrez exiger un résultat. Parfois, une simple action count
suffit.
TL; DR:
Ok, passons en revue les opérations RDD
.
RDD
s supporte deux types d'opérations:
Par exemple, map
est une transformation qui passe chaque élément de l'ensemble de données via une fonction et renvoie un nouveau RDD représentant les résultats. D'un autre côté, reduce
est une action qui agrège tous les éléments du RDD à l'aide d'une fonction et renvoie le résultat final au programme pilote (bien qu'il existe également un reduceByKey
parallèle qui renvoie un ensemble de données distribué).
Toutes les transformations en Spark sont paresseuses , en ce que elles ne calculent pas leurs résultats tout de suite.
Au lieu de cela, ils se souviennent simplement des transformations appliquées à un ensemble de données de base (par exemple, un fichier). Les transformations ne sont calculées que lorsqu'une action nécessite un résultat à renvoyer au programme pilote. Cette conception permet à Spark de s'exécuter plus efficacement - par exemple, nous pouvons réaliser qu'un ensemble de données créé via la carte sera utilisé dans une réduction et ne renverra que le résultat de la réduction au pilote, plutôt que le plus grand ensemble de données cartographiées.
Par défaut, chaque RDD
transformé peut être recalculé chaque fois que vous exécutez une action dessus. Cependant, vous pouvez également conserver un RDD
en mémoire en utilisant la méthode persist
(ou cache
), auquel cas Spark conservera le éléments autour du cluster pour un accès beaucoup plus rapide la prochaine fois que vous l'interrogez. Il est également possible de conserver les RDD
s persistants sur le disque ou répliqués sur plusieurs nœuds.
Pour forcer Spark pour exécuter un appel à la carte, vous devrez exiger un résultat. Parfois, une action count
est suffisante.
Spark transformations ne décrit que ce qui doit être fait. Pour déclencher une exécution, vous avez besoin d'une action .
Dans votre cas, il y a un problème plus profond. Si l'objectif est de créer une sorte d'effet secondaire, comme le stockage de données sur HDFS, la bonne méthode à utiliser est foreach
. C'est à la fois une action et une sémantique propre. Ce qui est également important, contrairement à map
, cela n'implique pas la transparence référentielle.