Diese Antwort erweitert die akzeptierte Antwort, bietet mehr Kontext und Code-Snippets, die Sie in der Spark-Shell auf Ihrem Computer ausführen können.
Mehr Kontext zur akzeptierten Antwort
Die akzeptierte Antwort könnte den Eindruck erwecken, dass der Beispielcode eine einzelne mydata.csv
Datei ausgibt, und das ist nicht der Fall. Lassen Sie uns demonstrieren:
val df = Seq("one", "two", "three").toDF("num")
df
.repartition(1)
.write.csv(sys.env("HOME")+ "/Documents/tmp/mydata.csv")
Folgendes wird ausgegeben:
Documents/
tmp/
mydata.csv/
_SUCCESS
part-00000-b3700504-e58b-4552-880b-e7b52c60157e-c000.csv
NB mydata.csv
ist ein Ordner in der akzeptierten Antwort - es ist keine Datei!
So geben Sie eine einzelne Datei mit einem bestimmten Namen aus
Wir können spark-daria verwenden , um eine einzelne mydata.csv
Datei zu schreiben .
import com.github.mrpowers.spark.daria.sql.DariaWriters
DariaWriters.writeSingleFile(
df = df,
format = "csv",
sc = spark.sparkContext,
tmpFolder = sys.env("HOME") + "/Documents/better/staging",
filename = sys.env("HOME") + "/Documents/better/mydata.csv"
)
Dadurch wird die Datei wie folgt ausgegeben:
Documents/
better/
mydata.csv
S3-Pfade
Sie müssen s3a-Pfade übergeben DariaWriters.writeSingleFile
, um diese Methode in S3 verwenden zu können:
DariaWriters.writeSingleFile(
df = df,
format = "csv",
sc = spark.sparkContext,
tmpFolder = "s3a://bucket/data/src",
filename = "s3a://bucket/data/dest/my_cool_file.csv"
)
Siehe hier für weitere Informationen.
CopyMerge vermeiden
copyMerge wurde aus Hadoop 3 entfernt. Die DariaWriters.writeSingleFile
Implementierung verwendet fs.rename
, wie hier beschrieben . Spark 3 verwendete immer noch Hadoop 2 , sodass CopyMerge-Implementierungen im Jahr 2020 funktionieren werden. Ich bin nicht sicher, wann Spark auf Hadoop 3 aktualisiert wird, aber es ist besser, jeden copyMerge-Ansatz zu vermeiden, der dazu führt, dass Ihr Code beim Upgrade von Spark Hadoop beschädigt wird.
Quellcode
Suchen Sie DariaWriters
im Spark-Daria-Quellcode nach dem Objekt, wenn Sie die Implementierung überprüfen möchten.
PySpark-Implementierung
Mit PySpark ist es einfacher, eine einzelne Datei zu schreiben, da Sie den DataFrame in einen Pandas DataFrame konvertieren können, der standardmäßig als einzelne Datei geschrieben wird.
from pathlib import Path
home = str(Path.home())
data = [
("jellyfish", "JALYF"),
("li", "L"),
("luisa", "LAS"),
(None, None)
]
df = spark.createDataFrame(data, ["word", "expected"])
df.toPandas().to_csv(home + "/Documents/tmp/mydata-from-pyspark.csv", sep=',', header=True, index=False)
Einschränkungen
Der DariaWriters.writeSingleFile
Scala-Ansatz und der df.toPandas()
Python-Ansatz funktionieren nur für kleine Datensätze. Riesige Datensätze können nicht als einzelne Dateien ausgeschrieben werden. Das Schreiben von Daten als einzelne Datei ist aus Sicht der Leistung nicht optimal, da die Daten nicht parallel geschrieben werden können.