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?
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.
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);
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.
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.
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.
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
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