Saya mencoba mencetak konten koleksi ke konsol Spark.
Saya punya tipe:
linesWithSessionId: org.apache.spark.rdd.RDD[String] = FilteredRDD[3]
Dan saya menggunakan perintah:
scala> linesWithSessionId.map(line => println(line))
Tapi ini dicetak:
res1: org.apache.spark.rdd.RDD [Unit] = MappedRDD [4] di peta pada: 19
Bagaimana cara menulis RDD ke konsol atau menyimpannya ke disk sehingga saya dapat melihat isinya?
scala
apache-spark
langit biru
sumber
sumber
show
metode.Jawaban:
Jika Anda ingin melihat konten RDD, salah satu caranya adalah dengan menggunakan
collect()
:Itu bukanlah ide yang baik, meskipun, RDD memiliki milyaran baris. Gunakan
take()
untuk mengambil sedikit saja untuk dicetak:sumber
saveAsTextFile
RDD adalah, saya perlu menulis konten RDD menjadi lebih dari satu file, itulah mengapa saya menggunakanforeach
The
map
fungsi adalah transformasi , yang berarti bahwa Spark tidak akan benar-benar mengevaluasi RDD Anda sampai Anda menjalankan aksi di atasnya.Untuk mencetaknya, Anda dapat menggunakan
foreach
(yang merupakan tindakan):Untuk menulisnya ke disk, Anda dapat menggunakan salah satu
saveAs...
fungsi (tindakan diam) dari RDD APIsumber
collect
agar RDD bisa dicetak di konsol.foreach
sendiri pertama-tama akan "mewujudkan" RDD dan kemudian menjalankanprintln
setiap elemen, jadicollect
tidak terlalu dibutuhkan di sini (meskipun Anda dapat menggunakannya, tentu saja) ...foreach
berfungsi dengan baik. Jika Anda menjalankan pekerjaan pada sebuah cluster dan Anda ingin mencetak rdd Anda maka Anda haruscollect
(seperti yang ditunjukkan oleh komentar dan jawaban lain) sehingga dikirim ke driver sebelumprintln
dijalankan. Dan menggunakantake
seperti yang disarankan oleh Oussama mungkin merupakan ide yang bagus jika RDD Anda terlalu besar.Jika Anda menjalankan ini di cluster maka
println
tidak akan mencetak kembali ke konteks Anda. Anda perlu membawaRDD
data ke sesi Anda. Untuk melakukan ini, Anda dapat memaksanya ke array lokal dan kemudian mencetaknya:sumber
Anda dapat mengubah Anda
RDD
menjadiDataFrame
lalushow()
itu.Ini akan menampilkan 20 baris teratas dari data Anda, jadi ukuran data Anda seharusnya tidak menjadi masalah.
sumber
import spark.implicits._
toDF
atauspark.implicits._
dalam lingkup percikan.Mungkin ada banyak perbedaan arsitektural antara
myRDD.foreach(println)
danmyRDD.collect().foreach(println)
(tidak hanya 'kumpulkan', tetapi juga tindakan lainnya). Salah satu perbedaan yang saya lihat adalah ketika melakukanmyRDD.foreach(println)
, outputnya akan dalam urutan acak. Misalnya: jika rdd saya berasal dari file teks di mana setiap baris memiliki nomor, output akan memiliki urutan yang berbeda. Tetapi ketika saya melakukannyamyRDD.collect().foreach(println)
, urutan tetap seperti file teks.sumber
Dengan python
Ini akan mencetak semua konten RDD
sumber
dan Spark versi yang lebih baru akan menampilkan tabel dengan baik.
sumber
Alih-alih mengetik setiap kali, Anda bisa;
[1] Buat metode cetak umum di dalam Spark Shell.
[2] Atau bahkan lebih baik, menggunakan implikasinya, Anda dapat menambahkan fungsi ke kelas RDD untuk mencetak isinya.
Contoh penggunaan:
Keluaran:
Penting
Ini hanya masuk akal jika Anda bekerja dalam mode lokal dan dengan sedikit kumpulan data. Jika tidak, Anda tidak akan dapat melihat hasilnya di klien atau kehabisan memori karena hasil dataset yang besar.
sumber
Anda juga dapat menyimpan sebagai file:
rdd.saveAsTextFile("alicia.txt")
sumber
Dalam sintaks java:
sumber