web-dev-qa-db-fra.com

Spécification du nom de fichier lors de l'enregistrement d'un DataFrame en tant que CSV

Disons que j'ai Spark DF que je veux enregistrer sur un disque un fichier CSV. Dans. Spark 2.0.0+ , on peut convertir DataFrame(DataSet[Rows]) en tant que DataFrameWriter et utiliser le .csv méthode pour écrire le fichier.

La fonction est définie comme

def csv(path: String): Unit
    path : the location/folder name and not the file name.

Spark stocke le fichier csv à l'emplacement spécifié en créant des fichiers CSV portant le nom - part - *. Csv.

Existe-t-il un moyen de sauvegarder le fichier CSV avec le nom de fichier spécifié au lieu de la partie - *. Csv? Ou possible de spécifier le préfixe au lieu de la partie-r?

Code:

df.coalesce(1).write.csv("sample_path")

sortie actuelle:

sample_path
|
+-- part-r-00000.csv

Sortie souhaitée:

sample_path
|
+-- my_file.csv

Remarque: La fonction coalesce est utilisée pour générer un fichier unique et l'exécuteur a suffisamment de mémoire pour collecter le DF sans erreur de mémoire.

21
Spandan Brahmbhatt

Il n'est pas possible de le faire directement dans Spark's save

Spark utilise le format de fichier Hadoop, qui nécessite de partitionner les données - c’est pourquoi vous avez part- des dossiers. Vous pouvez facilement changer le nom de fichier après le traitement, comme dans this question

Dans Scala cela ressemblera à:

import org.Apache.hadoop.fs._;
val fs = FileSystem.get(sc.hadoopConfiguration);
val file = fs.globStatus(new Path("path/file.csv/part*"))(0).getPath().getName();

fs.rename(new Path("csvDirectory/" + file), new Path("mydata.csv"));
fs.delete(new Path("mydata.csv-temp"), true);

ou juste:

import org.Apache.hadoop.fs._;
val fs = FileSystem.get(sc.hadoopConfiguration());
fs.rename(new Path("csvDirectory/data.csv/part-0000"), new Path("csvDirectory/newData.csv"));

Edit: Comme mentionné dans les commentaires, vous pouvez également écrire votre propre OutputFormat, veuillez consulter les documents de information à propos de cette approche pour définir le nom de fichier

24
T. Gawęda