-1
votes

La fonction Lambda ne met pas à jour la matrice de la portée extérieure

Comme vous le savez, "la variable locale définie dans une portée entorcière doit être définitive ou efficace". J'ai donc le code suivant xxx

ligne 1 imprimé 1 et la ligne 2 imprimé 0 . Il semble que la liste filteredarilines n'était pas remplie. Des idées pourquoi? Et comment puis-je obtenir les valeurs dans l'expression de Lambda disponible à l'extérieur? Merci.


3 commentaires

La fermeture à l'intérieur carte n'utilise pas réellement f , qui représente un objet de la collection RDD . Étant donné que vous n'utilisez pas f , ni générant un objet de la compagnie , donc l'expression Lambda n'a aucun sens.


Totalement d'accord mais peut-être que son foo () est un peu foo (f) ?


Désolé, je n'ai pas fait cela clair. le foo () devrait être foo (f).


3 Réponses :


0
votes

Je ne sais pas ce que RDD est et quel rdd.map () fait, mais le fait que vous y passez une expression lambda ne signifie pas que Il est exécuté immédiatement (ou du tout).

Par conséquent, lorsque vous imprimez filteredarilines.size () Dans la dernière ligne de votre extrait de votre extrait, l'expression Lambda n'a probablement pas encore exécuté, la liste est toujours vide.


1 commentaires

Y a-t-il une façon de forcer un peu de code après RDD.MAP () est terminé?



0
votes

Vous pouvez mapper votre résultat directement dans la liste comme celle-ci:

List<Airline> filteredAirlines = rdd.map(f -> {
      ......
      results = foo();
      System.out.println(results.getFilteredAirlines().size());
      return results.getFilteredAirlines();
}).collect(Collectors.toList());


2 commentaires

Si {...} n'utilise pas f , quel est le point de l'expression Lambda?


C'est exact. Je n'ai pas pensé à l'affaire qu'il n'utilise même pas f .



0
votes
  1. Votre Lambda s'appelle une fermeture car elle capture quelque chose de la portée extérieure (ici votre tableau).
  2. Il est totalement découragé d'utiliser une fermeture qui capture des objets destinés à être modifiés. C'est parce que cela ne fonctionnera peut-être que dans mode local : en effet dans mode de cluster après la sérialisation / la désérialisation, chaque objet capturé aura une version d'elle-même de manière indépendante sur chaque JVM. Je vous ai pointé sur Spark's Doc sur Comprendre les fermetures
  3. Le moyen le plus propre de faire ce que vous voulez peut être d'utiliser accumulateurs

2 commentaires

Utilisez des accumulateurs comme vous l'avez suggéré. Il fonctionne comme un charme. Merci!!


Bien fait, j'ai édité le titre de votre question pour le rendre plus expressif.