Comment puis-je forcer Spark à exécuter un appel à la carte, même s’il pense que cela n’a pas besoin d’être exécuté en raison de son évaluation paresseuse?
J’ai essayé de mettre cache()
avec l’appel de la carte, mais cela ne fait toujours pas l’affaire. Ma méthode de carte télécharge les résultats vers HDFS. Donc, ce n’est pas inutile, mais Spark pense que c’est le cas.
Réponse courte:
Pour forcer Spark à exécuter une transformation, vous devez demander un résultat. Parfois, une simple action de count
suffit.
TL; DR:
Ok, passons en revue les opérations de RDD
.
RDD
prennent en charge deux types d’opérations:
Par exemple, map
est une transformation qui transmet chaque élément de jeu de données à une fonction et renvoie un nouveau RDD représentant les résultats. D’autre part, reduce
est une action qui regroupe tous les éléments du RDD en utilisant une fonction et renvoie le résultat final au programme du pilote (bien qu’il existe également une reduceByKey
parallèle, qui retourne un jeu de données dissortingbué).
Toutes les transformations dans Spark sont paresseuses , en ce sens qu’elles ne calculent pas leurs résultats immédiatement .
Au lieu de cela, ils se souviennent simplement des transformations appliquées à un dataset de base (un fichier, par exemple). Les transformations ne sont calculées que lorsqu’une action nécessite qu’un résultat soit renvoyé au programme de pilote. Cette conception permet à Spark de fonctionner plus efficacement – par exemple, nous pouvons nous rendre compte qu’un jeu 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 jeu de données mappé.
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 à l’aide de la méthode persist
(ou cache
). Dans ce cas, Spark conservera les éléments sur le cluster pour un access beaucoup plus rapide la prochaine fois que vous l’interrogerez. Il existe également un support pour les RDD
persistants sur le disque ou répliqués sur plusieurs nœuds.
Pour forcer Spark à exécuter un appel à la carte, vous devez demander un résultat. Parfois, une action de count
suffit.
Les transformations d’ étincelles décrivent uniquement 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 le but est de créer un effet secondaire, tel que le stockage de données sur HDFS, la méthode à utiliser est la bonne. C’est à la fois une action et une sémantique propre. Ce qui est également important, contrairement à la map
, n’implique pas de transparence référentielle.