Supposons que df
soit une image de données dans Spark. La façon d'écrire df
dans un seul fichier CSV est
df.coalesce(1).write.option("header", "true").csv("name.csv")
Cela écrira le cadre de données dans un fichier CSV contenu dans un dossier appelé name.csv
, mais le fichier CSV réel s'appellera quelque chose comme part-00000-af091215-57c0-45c4-a521-cd7d9afb5e54.csv
.
Je voudrais savoir s’il est possible d’éviter le dossier name.csv
et d’avoir le fichier CSV réel appelé name.csv
et non part-00000-af091215-57c0-45c4-a521-cd7d9afb5e54.csv
. La raison est que j’ai besoin d’écrire plusieurs fichiers CSV que je lirai plus tard ensemble en Python, mais mon code Python utilise les noms CSV réels et doit également avoir tous les fichiers CSV uniques dans un dossier (et non un dossier). des dossiers).
Toute aide est appréciée.
Une solution possible pourrait être de convertir le cadre de données Spark en un cadre de données pandas et de le sauvegarder au format csv:
df.toPandas().to_csv("<path>/<filename>")
Il n’existe pas d’API spark Dataframe permettant d’écrire/de créer un fichier unique au lieu d’un répertoire à la suite d’une opération d’écriture.
Sous les deux options, un seul fichier dans le répertoire est créé avec les fichiers standard (_SUCCESS, _committed, _started).
df.coalesce (1) .write.mode ("écraser"). format ("com.databricks.spark.csv"). option ("en-tête", "true"). csv ("PATH/FOLDER_NAME/x.csv ")
df.repartition (1) .write.mode ("écraser"). format ("com.databricks.spark.csv"). option ("en-tête", "true"). csv ("PATH/FOLDER_NAME/x.csv ")
Si vous n'utilisez ni coalesce (1) ni repartition (1) et ne tirez pas parti du parallélisme des étincelles pour écrire des fichiers, il créera plusieurs fichiers de données dans le même répertoire.
Vous devez écrire une fonction dans le pilote qui combine toutes les parties de fichier de données dans un seul fichier (cat part-00000 * singlefilename) une fois l'opération d'écriture effectuée.