scala - Especificar el nombre de archivo al guardar un DataFrame como CSV
apache-spark pyspark (1)
Esta pregunta ya tiene una respuesta aquí:
Digamos que tengo un Spark DF que quiero guardar en el disco un archivo CSV.
En Spark 2.0.0+, uno puede convertir
DataFrame(DataSet[Rows])
como
DataFrameWriter
y usar el método
.csv
para escribir el archivo.
La función se define como
def csv(path: String): Unit
path : the location/folder name and not the file name.
Spark almacena el archivo csv en la ubicación especificada creando archivos CSV con nombre - parte - *. Csv.
¿Hay alguna manera de guardar el CSV con el nombre de archivo especificado en lugar de la parte - *. Csv? ¿O es posible especificar el prefijo en lugar de la parte r?
Código:
df.coalesce(1).write.csv("sample_path")
Salida de corriente :
sample_path
|
+-- part-r-00000.csv
Salida deseada :
sample_path
|
+-- my_file.csv
Nota: La función de fusión se utiliza para generar un solo archivo y el ejecutor tiene suficiente memoria para recopilar el DF sin error de memoria.
No es posible hacerlo directamente en Spark''s
save
Spark usa el formato de archivo Hadoop, que requiere que los datos se particionen, es por eso que tiene archivos
part-
.
Puede cambiar fácilmente el nombre de archivo después del procesamiento al igual que en
this
pregunta
En Scala se verá así:
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);
o solo:
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"));
Editar: como se menciona en los comentarios, también puede escribir su propio OutputFormat, consulte los documentos para information sobre este enfoque para establecer el nombre del archivo