Estoy intentando imprimir el contenido de una colección en la consola Spark.
Tengo un tipo:
linesWithSessionId: org.apache.spark.rdd.RDD[String] = FilteredRDD[3]
Y uso el comando:
scala> linesWithSessionId.map(line => println(line))
Pero esto está impreso:
res1: org.apache.spark.rdd.RDD [Unidad] = MappedRDD [4] en el mapa en: 19
¿Cómo puedo escribir el RDD en la consola o guardarlo en el disco para poder ver su contenido?
scala
apache-spark
cielo azul
fuente
fuente
show
método.Respuestas:
Si desea ver el contenido de un RDD, una forma es usar
collect()
:Sin embargo, esa no es una buena idea cuando el RDD tiene miles de millones de líneas. Use
take()
para tomar solo unos pocos para imprimir:fuente
saveAsTextFile
RDD es porque necesito escribir el contenido RDD en más de un archivo, es por eso que estoy usandoforeach
La
map
función es una transformación , lo que significa que Spark en realidad no evaluará su RDD hasta que ejecute una acción sobre él.Para imprimirlo, puede usar
foreach
(que es una acción):Para escribirlo en el disco, puede usar una de las
saveAs...
funciones (aún acciones) de la API RDDfuente
collect
para que el RDD pueda imprimirse en la consola.foreach
primero "materializará" el RDD y luego se ejecutaráprintln
en cada elemento, porcollect
lo que no es realmente necesario aquí (aunque puede usarlo, por supuesto) ...foreach
funciona bien. Si está ejecutando un trabajo en un clúster y desea imprimir su rdd, entonces debecollect
(como lo indican otros comentarios y respuestas) para que se envíe al controlador antes de queprintln
se ejecute. Y usartake
según lo sugerido por Oussama podría ser una buena idea si su RDD es demasiado grande.Si está ejecutando esto en un clúster
println
, no volverá a imprimir en su contexto. Necesita traer losRDD
datos a su sesión. Para hacer esto, puede forzarlo a una matriz local y luego imprimirlo:fuente
Puede convertir su
RDD
aDataFrame
luegoshow()
.Esto mostrará las 20 líneas principales de sus datos, por lo que el tamaño de sus datos no debería ser un problema.
fuente
import spark.implicits._
toDF
nispark.implicits._
en alcance de chispa.Probablemente hay muchas diferencias arquitectónicas entre
myRDD.foreach(println)
ymyRDD.collect().foreach(println)
(no solo 'recoger', sino también otras acciones). Una de las diferencias que vi es que al hacerlomyRDD.foreach(println)
, la salida será en orden aleatorio. Por ejemplo: si mi rdd proviene de un archivo de texto donde cada línea tiene un número, la salida tendrá un orden diferente. Pero cuando lo hicemyRDD.collect().foreach(println)
, el orden permanece igual que el archivo de texto.fuente
En pitón
Esto imprimirá todo el contenido del RDD
fuente
y la versión más nueva de Spark mostrará la tabla muy bien.
fuente
En lugar de escribir cada vez, puedes;
[1] Cree un método de impresión genérico dentro de Spark Shell.
[2] O incluso mejor, usando implicits, puedes agregar la función a la clase RDD para imprimir su contenido.
Ejemplo de uso:
Salida:
Importante
Esto solo tiene sentido si está trabajando en modo local y con una pequeña cantidad de conjunto de datos. De lo contrario, no podrá ver los resultados en el cliente o quedarse sin memoria debido al resultado del gran conjunto de datos.
fuente
También puede guardar como archivo:
rdd.saveAsTextFile("alicia.txt")
fuente
En la sintaxis de Java:
fuente