Como imprimir o conteúdo do RDD?

Estou a tentar imprimir o conteúdo de uma colecção na consola de faíscas.

tenho um tipo:

linesWithSessionId: org.apache.spark.rdd.RDD[String] = FilteredRDD[3]

e eu uso o comando:

scala> linesWithSessionId.map(line => println(line))

mas isto está impresso:

[3]}Res1: org.Apache.faisca.rdd.RDD [unidade] = MappedRDD[ 4] no mapa a :19

Como posso escrever o RDD para consolar ou gravá-lo em disco para que eu possa ver o seu conteúdo?

Author: Jacek Laskowski, 2014-04-19

8 answers

Se quiser ver o conteúdo de um RDD, uma forma é usar collect():

myRDD.collect().foreach(println)
Mas isso não é boa ideia, quando o RDD tem biliões de linhas. Utilizar take() apenas alguns para imprimir:
myRDD.take(n).foreach(println)
 186
Author: Oussama, 2015-04-17 19:34:36

A função map é uma transformação, o que significa que a faísca não irá realmente avaliar o seu RDD até que execute uma acção nele.

Para imprimir, pode usar foreach (que é uma acção):

linesWithSessionId.foreach(println)

Para o gravar no disco, poderá usar uma das funções saveAs... (acções fixas) da API RDD.

 45
Author: fedragon, 2016-10-22 08:46:56

Se estiver a correr isto num conjunto, então println não irá imprimir de volta para o seu contexto. Você precisa trazer os dados RDD para sua sessão. Para fazer isso, você pode forçá-lo para a matriz local e, em seguida, imprimi-lo:

linesWithSessionId.toArray().foreach(line => println(line))
 11
Author: Noah, 2014-04-19 18:31:47

Podes converter o teu RDD para um DataFrame Depois show() isso.

// For implicit conversion from RDD to DataFrame
import spark.implicits._

fruits = sc.parallelize([("apple", 1), ("banana", 2), ("orange", 17)])

// convert to DF then show it
fruits.toDF().show()
Isto irá mostrar as 20 melhores linhas dos seus dados, por isso o tamanho dos seus dados não deve ser um problema.
+------+---+                                                                    
|    _1| _2|
+------+---+
| apple|  1|
|banana|  2|
|orange| 17|
+------+---+
 7
Author: Wesam, 2017-12-07 04:50:44
Existem provavelmente muitas diferenças arquitectónicas entre myRDD.foreach(println) e myRDD.collect().foreach(println) (não só 'recolher', mas também outras acções). Uma das diferenças que vi foi quando fiz myRDD.foreach(println), a saída será numa ordem aleatória. Para ex: se meu rdd está vindo de um arquivo de texto onde cada linha tem um número, a saída terá uma ordem diferente. Mas quando eu fiz myRDD.collect().foreach(println), a ordem permanece como o arquivo de texto.
 1
Author: Karan Gupta, 2016-01-09 21:32:14

Em python

   linesWithSessionIdCollect = linesWithSessionId.collect()
   linesWithSessionIdCollect

Isto irá imprimir todo o conteúdo do RDD

 1
Author: Niranjan Molkeri, 2016-04-25 00:57:27

Você também pode gravar como um ficheiro: rdd.saveAsTextFile("alicia.txt")

 1
Author: Thomas Decaux, 2016-10-17 11:44:24

Em vez de digitar de cada vez, você pode;

[1] Criar um método genérico de impressão dentro da Spark Shell.

def p(rdd: org.apache.spark.rdd.RDD[_]) = rdd.foreach(println)

[2] ou ainda melhor, usando implicits, você pode adicionar a função à classe RDD para imprimir o seu conteúdo.

implicit class Printer(rdd: org.apache.spark.rdd.RDD[_]) {
    def print = rdd.foreach(println)
}

Uso de exemplo:

val rdd = sc.parallelize(List(1,2,3,4)).map(_*2)

p(rdd) // 1
rdd.print // 2

Resultado:

2
6
4
8

PS. Estes só fazem sentido se você estiver trabalhando no modo local e com uma pequena quantidade de conjunto de dados. Caso contrário, você ou não será capaz de ver os resultados no cliente ou ficar sem memória por causa do grande resultado do conjunto de dados.

 0
Author: noego, 2017-01-10 11:46:53