Ich implementiere ein Modell in Spark als Python-Klasse, und jedes Mal, wenn ich versuche, eine Klassenmethode einer RDD zuzuordnen, schlägt es fehl. Mein tatsächlicher Code ist komplizierter, aber diese vereinfachte Version wird zum Kern des Problems:
%Vor%Wenn ich nun das Modell so (zum Beispiel) betreibe:
%Vor%Ich erhalte den folgenden Fehler:
Ausnahme: Scheint, dass Sie versuchen, SparkContext von einer Übertragungsvariable, einer Aktion oder einer Transforamtion aus zu referenzieren. SparkContext kann nur für den Treiber verwendet werden, nicht für Code, der auf Workern ausgeführt wird. Weitere Informationen finden Sie unter SPARK-5063.
Ich habe ein bisschen damit gespielt und es scheint zuverlässig zu geschehen, wenn ich versuche, einer RDD innerhalb der Klasse eine Klassenmethode zuzuordnen. Ich habe bestätigt, dass die abgebildete Funktion gut funktioniert, wenn ich außerhalb einer Klassenstruktur implementiere, also hat das Problem definitiv mit der Klasse zu tun. Gibt es eine Möglichkeit, dies zu lösen?
Problem ist hier ein wenig subtiler als mit geschachtelten RDDs oder Spark-Aktionen innerhalb von Transformationen . Spark erlaubt keinen Zugriff auf die Aktion " SparkContext
in Aktion" oder "Umwandlung".
Auch wenn Sie nicht explizit darauf zugreifen, wird es innerhalb des Closings referenziert und muss serialisiert und herumgetragen werden. Das bedeutet, dass Ihre transformation
-Methode, die self
referenziert, auch SparkContext
behält, daher der Fehler.
Eine Möglichkeit, dies zu umgehen, ist die Verwendung der statischen Methode:
%Vor%Bearbeiten :
Wenn Sie auf Instanzvariablen zugreifen können, können Sie Folgendes versuchen:
%Vor%Tags und Links python apache-spark pyspark