scala csv apache-spark pyspark

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