Estou tentando imprimir o conteúdo de uma coleção no console do Spark.
Eu 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 é impresso:
res1: org.apache.spark.rdd.RDD [Unidade] = MappedRDD [4] no mapa em: 19
Como gravar o RDD no console ou salvá-lo no disco para que eu possa visualizar seu conteúdo?
scala
apache-spark
céu azul
fonte
fonte
show
métodoRespostas:
Se você deseja visualizar o conteúdo de um RDD, uma maneira é usar
collect()
:Essa não é uma boa ideia, porém, quando o RDD possui bilhões de linhas. Use
take()
apenas alguns para imprimir:fonte
saveAsTextFile
no RDD é, eu preciso escrever o conteúdo RDD em mais de um arquivo, é por isso que eu estou usandoforeach
A
map
função é uma transformação , o que significa que o Spark não avaliará seu RDD até que você execute uma ação nele.Para imprimi-lo, você pode usar
foreach
(que é uma ação):Para gravá-lo no disco, você pode usar uma das
saveAs...
funções (ações estáticas) da API RDDfonte
collect
para que o RDD possa ser impresso no console.foreach
-se, em primeiro lugar "materializar" o RDD e depois executarprintln
em cada elemento, por issocollect
não é realmente necessário aqui (embora você pode usá-lo, é claro) ...foreach
funciona bem. Se você estiver executando um trabalho em um cluster e desejar imprimir o seu rdd, deverácollect
(como indicado por outros comentários e respostas) para que seja enviado ao driver antes deprintln
ser executado. E usartake
como sugerido por Oussama pode ser uma boa idéia se o seu RDD for muito grande.Se você estiver executando isso em um cluster,
println
não imprimirá de volta ao seu contexto. Você precisa trazer osRDD
dados para sua sessão. Para fazer isso, você pode forçá-lo à matriz local e imprimi-lo:fonte
Você pode converter seu
RDD
para umDataFrame
entãoshow()
.Isso mostrará as 20 principais linhas de seus dados, portanto, o tamanho dos seus dados não deve ser um problema.
fonte
import spark.implicits._
toDF
nemspark.implicits._
no escopo da faísca.Provavelmente existem muitas diferenças arquitetônicas entre
myRDD.foreach(println)
emyRDD.collect().foreach(println)
(não apenas 'coletar', mas também outras ações). Uma das diferenças que vi foi ao fazermyRDD.foreach(println)
, a saída será em uma ordem aleatória. Por exemplo: se meu rdd é proveniente de um arquivo de texto em que cada linha tem um número, a saída terá uma ordem diferente. Mas quando eu fizmyRDD.collect().foreach(println)
, a ordem permanece igual ao arquivo de texto.fonte
Em python
Isso imprimirá todo o conteúdo do RDD
fonte
e a versão mais recente do Spark mostrará bem a tabela.
fonte
Em vez de digitar cada vez, você pode;
[1] Crie um método de impressão genérico dentro do Spark Shell.
[2] Ou melhor ainda, usando implícitos, você pode adicionar a função à classe RDD para imprimir seu conteúdo.
Exemplo de uso:
Resultado:
Importante
Isso só faz sentido se você estiver trabalhando no modo local e com uma pequena quantidade de conjunto de dados. Caso contrário, você não poderá ver os resultados no cliente ou ficar sem memória devido ao grande resultado do conjunto de dados.
fonte
Você também pode salvar como um arquivo:
rdd.saveAsTextFile("alicia.txt")
fonte
Na sintaxe java:
fonte