Variabilele de difuzare PySpark din funcțiile locale

voturi
6

Sunt încercarea de a crea variabile de difuzare din cadrul metodelor Python (încearcă să abstracte unele metode de utilitate Creez care se bazează pe operațiuni distribuite). Cu toate acestea, eu nu pot par pentru a avea acces la variabilele de difuzare din cadrul muncitorilor Spark.

Să presupunem că am această configurare:

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 ###

Cu toate acestea, în cazul în care în loc să elimine SomeMethod()intermediarul, funcționează bine.

def main():
    sc = SparkContext()
    someValue = rand()
    V = sc.broadcast(someValue)
    A = sc.parallelize().map(worker)

def worker(element):
    element *= V.value   # works just fine

Prefer să nu trebuie să pună toată logica mea Spark în metoda principală, dacă pot. Există vreo modalitate de a difuza variabile din cadrul funcțiilor locale și trebuie să le fie la nivel global vizibile pentru muncitorii Spark?

În mod alternativ, ceea ce ar fi un model de design bun pentru acest tip de situație - de exemplu, vreau să scrie o metodă în mod special pentru Spark, care este autonom și îndeplinește o funcție specifică aș vrea să re-utilizare?

Întrebat 16/11/2014 la 14:27
sursa de către utilizator
În alte limbi...                            


1 răspunsuri

voturi
8

Nu sunt sigur că am înțeles complet întrebarea , dar, dacă aveți nevoie de Vobiect în interiorul funcției lucrător tine , atunci cu siguranță ar trebui să - l dați ca parametru, altfel metoda nu este cu adevărat autonom:

def worker(V, element):
    element *= V.value

Acum, în scopul de a utiliza în funcții de hartă trebuie să utilizați o parțială, astfel încât harta vede doar o funcție 1 parametru:

from functools import partial

def SomeMethod(sc):
    someValue = rand()
    V = sc.broadcast(someValue)
    A = sc.parallelize().map(partial(worker, V=V))
Publicat 25/11/2014 la 12:45
sursa de către utilizator

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more