2016-03-23 21 views
0

değişken dış değişiklikleri inat, ben mesela yapabilirsiniz:pyspark python'da mapper kapsamı

lRet = [] 
llData = [range(3) for i in range(5)] 
def func(l): 
    lRet.append(l[0]) 
    return l 

map(func, llData) 
print(lRet) 

-> [0, 0, 0, 0, 0] 

Şimdi, PySpark benzer bir şey yapmak istiyorum. Nedeni, RDD'mdeki harici bir şeyi, rdd'mdeki verilerden oluşturmam gerektiğidir. aynı şeyi Sağlar:

lRet = [] 
#rddData.collect() is of form llData above 
def func(l): 
    lRet.append(l[0]) 
    return l 

rddData.map(func).collect() 
print lRet 

-> [] 

Ben de sadece yerel pyspark örneğinde bir import pdb; pdb.set_trace() ilk örneği yapıyor lRet dahili olarak lRet izler rağmen değişmeden olmanın aynı sonucu verdiğini fark etmiş.

Herhangi bir fikrin var mı?

+0

'lRet 'oluşturduğunuzda, yalnızca ekliyor/ekliyor musunuz? Ekledikçe/eklediğinizde sipariş önemlidir mi? –

+0

@KatyaHandler Peki, gerçek hayatta seyrek bir matrise okumak/yazmak istiyorum. Kavramın aynı olması gerektiğini düşündüm, bu yüzden çok daha basit bir örnek kod oluşturdum. Sorunuza: Söz konusu matrise erişmek için indis kullanıyorum (analoji, llData'dan geliyor), bu yüzden sipariş önemli değil – Roman

+0

Yani, bunu paralel olarak yapmak, iki farklı görevin bir değişiklik yapması gerektiğinde ne olacağıdır. seyrek olmayan matrisinizdeki (x, y) yer değil mi? Belki de node 1 matrisi (x, y) = 1 olarak düşünürken, düğüm 7 matrisi (x, y) = 0 olarak düşünür. Hangisi doğrudur? Bu paralel olarak yapılamaz, çünkü doğal olarak sipariş vardır. Tek yol, [akümülatörler] (http://spark.apache.org/docs/latest/programming-guide.html#accumulators) kullanılarak yapılabilir. –

cevap

1

Kısa cevap şu ki mümkün değil. Kıvılcım programlaması, paylaşılan değiştirilebilen durumu korumak için gereken araçları kapsamaz. Kodunuzu çalıştırdığınızda, her yürütücü yorumlayıcısı yerel olarak değiştirilen ve daha sonra atılacak olan lRet değişkeninin kendi kopyasını edinir. Katya Handler in the comments Kıvılcım belirtildiği gibi

accumulators sağlar ancak bu salt vardır, eylemler dışında kullanıldığında tutarlı sonuçlar garanti etmez ve sürücü devlet mantığı gibi fold kullanarak görevin başına güncellemedir.

Uzun süren görevleri kullanan ve Spark üzerinde harici senkronizasyon ilkellerini kullanan projeler var ama tamamen farklı bir model.