PySpark de diffusion variables locales des fonctions
Je suis d'essayer de créer de diffusion des variables à partir de l'intérieur de Python méthodes (essayer de résumé de certaines méthodes de l'utilitaire, je suis de la création qui s'appuient sur des opérations réparties). Cependant, je n'arrive pas à accéder à l'émission des variables à partir de l'intérieur de l'Étincelle travailleurs.
Disons que j'ai cette config:
def main():
sc = SparkContext()
SomeMethod(sc)
def SomeMethod(sc):
someValue = rand()
V = sc.broadcast(someValue)
A = sc.parallelize().map(worker)
def worker(element):
element *= V.value ### NameError: global name 'V' is not defined ###
Cependant, si j'ai au lieu de supprimer le SomeMethod()
intermédiaire, il fonctionne très bien.
def main():
sc = SparkContext()
someValue = rand()
V = sc.broadcast(someValue)
A = sc.parallelize().map(worker)
def worker(element):
element *= V.value # works just fine
Je préfère ne pas mettre tous mes Étincelle logique dans la méthode main, si je peux. Est-il possible de diffuser des variables sur les fonctions et de leur monde visible à l'Étincelle travailleurs?
Sinon, ce serait un bon modèle de conception pour ce genre de situation-par exemple, je veux écrire une méthode spécifiquement pour l'Étincelle qui s'est auto-contenue et exerce une fonction spécifique, je voudrais ré-utiliser?
Vous devez vous connecter pour publier un commentaire.
Je ne suis pas sûr que j'ai bien saisi la question, mais, si vous avez besoin de la
V
objets à l'intérieur du travailleur en fonction de vous, alors vous avez certainement devraient se passer comme paramètre, sinon la méthode n'est pas vraiment autonome:Maintenant afin de l'utiliser dans les fonctions de mappage, vous devez utiliser une partielle, de sorte que la carte ne voit qu'un 1 paramètre fonction:
def transform(row): return broadcast_variable.value[row[0]]
qui est ensuite utilisée dans unmap()
fonction commerdd.map(transform)