2016-06-07 27 views
0

Ich habe einige ziemlich große Listen, auf die ich innerhalb jedes Objekts zugreifen muss, das meine RDD umfasst. Nachdem ich diese Listen ausgestrahlt habe, sollte ich also die Broadcast-Variable oder broadcast.value() in jedes der Objekte einfügen? Ich möchte nicht, dass die Liste für jedes Objekt repliziert wird, sondern dass jedes Objekt die Listen verwenden kann. Mein Code sieht in etwa wie folgt aus:Sollte ich die Broadcast-Variable oder broadcast.value() in meine RDD [benutzerdefiniertes Objekt] übergeben?

class foo(object): 
    def __init__(self, number, broadcasted) 
     self.NUMBER = number 
     self.BROADCASTED = broadcasted 

broadcasted_list = sc.broadcast([a, b, c, ...]) 

so sollte ich die RDD als

rdd = sc.parallelize([1, 2, 3]).map(lambda x: foo(x, broadcasted_list)) 

oder

rdd = sc.parallelize([1, 2, 3]).map(lambda x: foo(x, broadcasted_list.value())) 

Dank erstellen!

+0

Haben Sie es herausgefunden? Hat meine Lösung für Sie funktioniert? –

+0

yup danke! Ich ging mit nur die Broadcast-Variable übergeben und den Wert auf den Verweis auf das Objekt aufrufen, wenn ich es brauchte. – AStack41

Antwort

2

Hängt davon ab, was Sie wollen self.BROADCASTED enthalten. Ich nehme an, Sie haben Ihre Methode foo für dieses Beispiel vereinfacht, aber aus diesem Grund ist es nicht klar, was der Zweck von foo ist.

Wenn Sie wollen, dass es [a,b,c,..] enthält, dann tun Sie broadcasted_list.value().

Wenn diese Variable einen Verweis auf ein gesendetes Objekt enthalten soll, geben Sie broadcasted_list ein. Wenn Sie die Werte in der Liste benötigen, um weitere Berechnungen durchzuführen, möchten Sie broadcasted_list.value() verwenden. Ich glaube, Sie werden feststellen, dass Sie, wenn Sie broadcasted_list übergeben, nur einen Verweis auf ein Objekt erhalten, etwas, das wie folgt aussieht: <pyspark.broadcast.Broadcast object at 0x1f36f50>.