it-swarm.com.de

Spark - Wie schreibe ich eine einzelne CSV-Datei OHNE Ordner?

Angenommen, df ist ein Datenrahmen in Spark. Die Möglichkeit, df in eine einzelne CSV-Datei zu schreiben, ist

df.coalesce(1).write.option("header", "true").csv("name.csv")

Dadurch wird der Datenrahmen in eine CSV-Datei geschrieben, die sich in einem Ordner mit dem Namen name.csv befindet. Die eigentliche CSV-Datei wird jedoch als part-00000-af091215-57c0-45c4-a521-cd7d9afb5e54.csv bezeichnet.

Ich würde gerne wissen, ob es möglich ist, den Ordner name.csv zu umgehen und die eigentliche CSV-Datei mit dem Namen name.csv und nicht part-00000-af091215-57c0-45c4-a521-cd7d9afb5e54.csv zu haben. Der Grund dafür ist, dass ich mehrere CSV-Dateien schreiben muss, die ich später in Python zusammen lesen werde, aber mein Python-Code verwendet die tatsächlichen CSV-Namen und muss auch alle einzelnen CSV-Dateien in einem Ordner (und nicht in einem Ordner) haben von Ordnern).

Jede Hilfe wird geschätzt.

8
antonioACR1

Eine mögliche Lösung könnte sein, den Spark-Datenrahmen in einen Pandas-Datenrahmen zu konvertieren und als csv zu speichern:

df.toPandas().to_csv("<path>/<filename>")
2
Paul Vbl

Es gibt keine Dataframe-Spark-API, die als Ergebnis einer Schreiboperation eine einzelne Datei anstelle eines Verzeichnisses schreibt/erstellt.

Unter beiden Optionen wird eine einzige Datei innerhalb des Verzeichnisses zusammen mit Standarddateien (_SUCCESS, _committed, _started) erstellt.

  1. df.coalesce (1) .write.mode ("overwrite"). format ("com.databricks.spark.csv"). Option ("header", "true"). csv ("PATH/FOLDER_NAME/x.csv ") 

  2. df.repartition (1) .write.mode ("overwrite"). format ("com.databricks.spark.csv"). Option ("header", "true"). csv ("PATH/FOLDER_NAME/x.csv ")

Wenn Sie nicht coalesce (1) oder repartition (1) verwenden und die Funkenparallelität zum Schreiben von Dateien nutzen, werden mehrere Datendateien im Verzeichnis erstellt.

Sie müssen eine Funktion im Treiber schreiben, die alle Datendatei-Teile zu einer einzigen Datei (cat part-00000 * singlefilename) zusammenfasst, sobald der Schreibvorgang abgeschlossen ist.

0
Ravi