web-dev-qa-db-de.com

Was macht die Spark-DataFrame-Methode `toPandas` tatsächlich?

Ich bin ein Anfänger der Spark-DataFrame-API. 

Ich verwende diesen Code zum Laden von csv-Tabs, die in Spark Dataframe getrennt sind

lines = sc.textFile('tail5.csv')
parts = lines.map(lambda l : l.strip().split('\t'))
fnames = *some name list*
schemaData = StructType([StructField(fname, StringType(), True) for fname in fnames])
ddf = sqlContext.createDataFrame(parts,schemaData)

Angenommen, ich erstelle DataFrame mit Spark aus neuen Dateien und konvertiere sie mit der integrierten Methode toPandas () in Pandas.

  • Speichert es das Pandas-Objekt im lokalen Speicher?
  • Wird die Low-Level-Berechnung von Pandas alle von Spark ausgeführt?
  • Hat es alle Pandas-Dataframe-Funktionen verfügbar gemacht? (Ich denke, ja)
  • Kann ich es in Pandas konvertieren und damit fertig werden, ohne die DataFrame-API zu berühren? 
37
Napitupulu Jon

Die Verwendung von spark zum Einlesen einer CSV-Datei in pandas ist eine ziemlich runde Methode, um das Endziel des Lesens einer CSV-Datei in den Speicher zu erreichen.

Es scheint, als würden Sie die Anwendungsfälle der hier verwendeten Technologien missverstehen.

Spark ist für verteiltes Rechnen vorgesehen (kann jedoch lokal verwendet werden). Es ist im Allgemeinen viel zu schwer, um einfach in eine CSV-Datei eingelesen zu werden.

In Ihrem Beispiel erhalten Sie mit der sc.textFile-Methode einfach eine Funken-RDD, bei der es sich tatsächlich um eine Liste von Textzeilen handelt. Das ist wahrscheinlich nicht das, was Sie wollen. Es wird keine Typinferenz durchgeführt. Wenn Sie also eine Spalte mit Zahlen in Ihrer CSV-Datei summieren möchten, können Sie dies nicht tun, da es sich bei Spark noch um Strings handelt.

Verwenden Sie einfach pandas.read_csv und lesen Sie die gesamte CSV in den Speicher. Pandas ermitteln automatisch den Typ jeder Spalte. Spark tut das nicht.

Nun zur Beantwortung Ihrer Fragen:

Speichert es das Pandas-Objekt im lokalen Speicher :

Ja. toPandas() konvertiert den Spark DataFrame in einen Pandas DataFrame, der sich natürlich im Speicher befindet.

Wird die Pandas Low-Level-Berechnung alle von Spark ausgeführt

Pandas führt eigene Berechnungen durch, es gibt kein Zusammenspiel zwischen Funken und Pandas, es gibt lediglich eine einige API-Kompatibilität.

Hat es alle Pandas-Dataframe-Funktionen verfügbar gemacht?

Nein. Zum Beispiel haben Series-Objekte eine interpolate-Methode, die in PySpark-Column-Objekten nicht verfügbar ist. Es gibt viele Methoden und Funktionen in der Pandas-API, die nicht in der PySpark-API enthalten sind.

Kann ich es in Pandas konvertieren und damit fertig werden, ohne die DataFrame-API zu berühren?

Absolut. Tatsächlich sollten Sie Spark in diesem Fall wahrscheinlich gar nicht verwenden. pandas.read_csv wird Ihren Anwendungsfall wahrscheinlich behandeln, es sei denn, Sie arbeiten mit einer großen Datenmenge von riesige.

Versuchen Sie, Ihr Problem mit einfachen, leicht verständlichen Bibliotheken zu lösen, die mit wenig Technik auskommen, und mit only etwas komplizierter zu machen, je nach Bedarf. Oft benötigen Sie keine komplexere Technologie.

48
Phillip Cloud

Wenn Sie eine Spark-Kontext- oder Hive-Kontext-Methode (sc.textFile(), hc.sql()) verwenden, um Daten in den Speicher zu lesen, wird eine RDD zurückgegeben. Die RDD verbleibt jedoch im verteilten Speicher (Speicher auf den Arbeiterknoten) und nicht auf dem Master-Knoten. Alle RDD-Methoden (rdd.map(), rdd.reduceByKey() usw.) sind mit einigen Ausnahmen auf den Arbeiterknoten parallel ausgeführt. Wenn Sie beispielsweise eine rdd.collect()-Methode ausführen, kopieren Sie den Inhalt der rdd von allen Arbeitsknoten in den Hauptspeicherknoten. Dadurch verlieren Sie Ihre verteilten Rechenleistungen (können jedoch weiterhin die rdd-Methoden ausführen).

Ähnlich wie bei Pandas kopieren Sie beim Ausführen von toPandas() den Datenrahmen aus verteiltem Arbeitsspeicher in den lokalen Hauptspeicher (Master-Arbeitsspeicher) und verlieren den Großteil Ihrer Funktionen für verteilte Berechnungen. Ein möglicher Workflow (den ich häufig verwende) könnte sein, Ihre Daten mithilfe verteilter Berechnungsmethoden auf eine vernünftige Größe zu bringen und dann in einen Pandas-Datenrahmen für das umfangreiche Feature-Set zu konvertieren. Hoffentlich hilft das.

1
TheProletariat