J'essaie d'exporter des données d'un spark dataframe vers un fichier .csv:
df.coalesce(1)\
.write\
.format("com.databricks.spark.csv")\
.option("header", "true")\
.save(output_path)
Il crée un nom de fichier "part-r-00001-512872f2-9b51-46c5-b0ee-31d626063571.csv"
Je veux que le nom de fichier soit "part-r-00000.csv" ou "part-00000.csv"
Comme le fichier est créé sur AWS S3, je suis limité dans la façon dont je peux utiliser les commandes os.system.
Comment puis-je définir le nom du fichier tout en conservant l'en-tête dans le fichier?
Merci!
Eh bien, même si j'ai une note de -3 pour ma question, ici, je publie la solution qui m'a aidé à résoudre le problème. En tant que technicien, je me soucie toujours plus du code/de la logique que de la grammaire. Au moins pour moi, un petit contexte devrait faire pour comprendre le problème.
Venir à la solution:
Lorsque nous créons un fichier .csv à partir de spark dataframe,
Le fichier de sortie est par défaut nommé part-x-yyyyy où:
1) x est soit `` m '' soit `` r '', selon que le travail était un travail de mappage uniquement, ou réduit 2) yyyyy est le numéro de tâche de mappage ou de réduction, soit 00000 ou un nombre aléatoire.
Pour renommer le fichier de sortie, l'exécution d'une commande os.system HDFS devrait suffire.
import os, sys
output_path_stage = //set the source folder path here
output_path = // set the target folder path here
//creating system command line
cmd2 = "hdfs dfs -mv " + output_path_stage + 'part-*' + ' ' + output_path + 'new_name.csv'
//executing system command
os.system(cmd2)
fyi, si nous utilisons l'option rdd.saveAsTextFile, le fichier est créé sans en-tête. Si nous utilisons coalesce(1).write.format("com.databricks.spark.csv").option("header", "true").save(output_path)
, le fichier est créé avec un nom aléatoire part-x. La solution ci-dessus nous aidera à créer un fichier .csv avec en-tête, délimiteur et nom de fichier requis.