Cette réponse développe la réponse acceptée, donne plus de contexte et fournit des extraits de code que vous pouvez exécuter dans Spark Shell sur votre ordinateur.
Plus de contexte sur la réponse acceptée
La réponse acceptée peut vous donner l'impression que l'exemple de code génère un seul mydata.csv
fichier et ce n'est pas le cas. Démontrons:
val df = Seq("one", "two", "three").toDF("num")
df
.repartition(1)
.write.csv(sys.env("HOME")+ "/Documents/tmp/mydata.csv")
Voici ce qui est sorti:
Documents/
tmp/
mydata.csv/
_SUCCESS
part-00000-b3700504-e58b-4552-880b-e7b52c60157e-c000.csv
NB mydata.csv
est un dossier dans la réponse acceptée - ce n'est pas un fichier!
Comment sortir un seul fichier avec un nom spécifique
Nous pouvons utiliser spark-daria pour écrire un seul mydata.csv
fichier.
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"
)
Cela produira le fichier comme suit:
Documents/
better/
mydata.csv
Chemins S3
Vous devrez passer les chemins s3a à DariaWriters.writeSingleFile
pour utiliser cette méthode dans S3:
DariaWriters.writeSingleFile(
df = df,
format = "csv",
sc = spark.sparkContext,
tmpFolder = "s3a://bucket/data/src",
filename = "s3a://bucket/data/dest/my_cool_file.csv"
)
Voir ici pour plus d'informations.
Éviter la copie
copyMerge a été supprimé de Hadoop 3. L' DariaWriters.writeSingleFile
implémentation utilise fs.rename
, comme décrit ici . Spark 3 utilisait toujours Hadoop 2 , donc les implémentations de copyMerge fonctionneront en 2020. Je ne sais pas quand Spark passera à Hadoop 3, mais mieux vaut éviter toute approche copyMerge qui entraînerait la rupture de votre code lorsque Spark mettra à niveau Hadoop.
Code source
Recherchez l' DariaWriters
objet dans le code source de spark-daria si vous souhaitez inspecter l'implémentation.
Implémentation PySpark
Il est plus facile d'écrire un seul fichier avec PySpark car vous pouvez convertir le DataFrame en un Pandas DataFrame qui est écrit en tant que fichier unique par défaut.
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)
Limites
L' DariaWriters.writeSingleFile
approche Scala et l' df.toPandas()
approche Python ne fonctionnent que pour les petits ensembles de données. Les énormes ensembles de données ne peuvent pas être écrits en tant que fichiers uniques. L'écriture de données sous forme de fichier unique n'est pas optimale du point de vue des performances, car les données ne peuvent pas être écrites en parallèle.