Cómo escribir en CSV en Spark


Estoy tratando de encontrar una manera efectiva de guardar el resultado de mi trabajo de Spark como un archivo csv. Estoy usando Spark con Hadoop y hasta ahora todos mis archivos se guardan como part-00000.

¿Alguna idea de cómo guardar mi spark en un archivo con un nombre de archivo especificado?

Author: Ram Ghadiyaram, 2014-05-08

6 answers

Dado que Spark utiliza la API del Sistema de archivos Hadoop para escribir datos en archivos, esto es algo inevitable. Si lo hace

rdd.saveAsTextFile("foo")

Se guardará como "foo/part-XXXXX" con un archivo de parte-* cada partición en el RDD que esté tratando de guardar. La razón por la que cada partición en el RDD se escribe en un archivo separado es por tolerancia a fallos. Si la tarea que escribe la 3ra partición (es decir, a part-00002) falla, Spark simplemente vuelve a ejecutar la tarea y sobrescribe el part-00002 parcialmente escrito/dañado, sin efecto en otras partes. Si todos escribió en el mismo archivo, entonces es mucho más difícil recuperar una sola tarea para los errores.

Los archivos part-XXXXX no suelen ser un problema si vas a consumirlos de nuevo en frameworks basados en Spark / Hadoop porque como todos usan HDFS API, si les pides que lean "foo", también leerán todos los archivos part-XXXXX dentro de foo.

 52
Author: Tathagata Das,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-10-15 13:29:16

Sugeriré hacerlo de esta manera (ejemplo de Java):

theRddToPrint.coalesce(1, true).saveAsTextFile(textFileName);
FileSystem fs = anyUtilClass.getHadoopFileSystem(rootFolder);
FileUtil.copyMerge(
    fs, new Path(textFileName),
    fs, new Path(textFileNameDestiny),
    true, fs.getConf(), null);
 10
Author: adoalonso,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-06-05 04:19:13

Existe otro enfoque basado en el sistema de ficheros ops de Hadoop.

 3
Author: pls,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-06-02 10:49:23

Extendiendo Tathagata Das respuesta a Spark 2.x y Scala 2.11

Usando Spark SQL podemos hacer esto en un solo liner

//implicits for magic functions like .toDf
import spark.implicits._

val df = Seq(
  ("first", 2.0),
  ("choose", 7.0),
  ("test", 1.5)
).toDF("name", "vals")

//write DataFrame/DataSet to external storage
df.write
  .format("csv")
  .save("csv/file/location")

Entonces puedes ir de cabeza y proceder con la respuesta de adoalonso.

 1
Author: mrsrinivas,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-09-05 11:46:45

Tengo una idea, pero no un fragmento de código listo. Internamente (como su nombre indica) Spark utiliza el formato de salida Hadoop. (así como InputFormat al leer desde HDFS).

En el FileOutputFormat de hadoop hay un miembro protegido setOutputFormat, al que puede llamar desde la clase heredada para establecer otro nombre base.

 1
Author: David Gruzman,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-10-15 13:28:07

No es realmente una solución limpia, pero dentro de un foreachRDD () básicamente puedes hacer lo que quieras, también crear un nuevo archivo.

En mi solución esto es lo que hago: guardo la salida en HDFS (por razones de tolerancia a fallos), y dentro de un foreachRDD también creo un archivo TSV con estadísticas en una carpeta local.

Creo que probablemente podrías hacer lo mismo si eso es lo que necesitas.

Http://spark.apache.org/docs/0.9.1/streaming-programming-guide.html#output-operations

 0
Author: gprivitera,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-10-15 13:26:04