Apa perbedaan antara RDD map
dan mapPartitions
metode? Dan apakah flatMap
berperilaku suka map
atau suka mapPartitions
? Terima kasih.
(Sunting) yaitu apa perbedaan (baik secara semantik atau dalam hal eksekusi) antara
def map[A, B](rdd: RDD[A], fn: (A => B))
(implicit a: Manifest[A], b: Manifest[B]): RDD[B] = {
rdd.mapPartitions({ iter: Iterator[A] => for (i <- iter) yield fn(i) },
preservesPartitioning = true)
}
Dan:
def map[A, B](rdd: RDD[A], fn: (A => B))
(implicit a: Manifest[A], b: Manifest[B]): RDD[B] = {
rdd.map(fn)
}
performance
scala
apache-spark
rdd
Nicholas White
sumber
sumber
Jawaban:
Peta metode mengubah setiap elemen dari RDD sumber menjadi elemen tunggal dari hasil RDD dengan menerapkan fungsi. mapPartitions mengubah setiap partisi RDD sumber menjadi beberapa elemen dari hasil (mungkin tidak ada).
Baik flatMap bekerja pada elemen tunggal (as
map
) dan menghasilkan banyak elemen dari hasilnya (asmapPartitions
).sumber
map
danflatMap
memiliki partisi yang persis sama dengan induknya.map
pada dasarnya mengambil fungsi Andaf
, dan meneruskannya keiter.map(f)
. Jadi pada dasarnya ini adalah metode kenyamanan yang membungkusmapPartitions
. Saya akan terkejut jika ada keuntungan kinerja baik cara untuk pekerjaan transformasi gaya peta murni (yaitu di mana fungsinya identik), jika Anda perlu membuat beberapa objek untuk diproses, jika objek ini dapat dibagikan makamapPartitions
akan menguntungkan.Imp. TIP:
Iya. silakan lihat contoh 2 dari
flatmap
.. penjelasannya sendiri.Skenario Contoh : jika kita memiliki elemen 100K di
RDD
partisitertentumaka kita akan menjalankan fungsi yang digunakan oleh transformasi pemetaan 100K kali ketika kita gunakanmap
.Sebaliknya, jika kita menggunakan
mapPartitions
maka kita hanya akan memanggil fungsi tertentu satu kali, tetapi kita akan melewati semua catatan 100 ribu dan mendapatkan kembali semua tanggapan dalam satu panggilan fungsi.Akan ada perolehan kinerja karena
map
bekerja pada fungsi tertentu berkali-kali, terutama jika fungsi tersebut melakukan sesuatu yang mahal setiap kali itu tidak perlu dilakukan jika kita melewati semua elemen sekaligus (dalam kasusmappartitions
).peta
Contoh:
mapPartitions
Contoh 1
Contoh 2
Program di atas juga dapat ditulis menggunakan flatMap sebagai berikut.
Contoh 2 menggunakan flatmap
Kesimpulan:
mapPartitions
transformasi lebih cepat daripadamap
karena memanggil fungsi Anda sekali / partisi, bukan sekali / elemen ..Bacaan lebih lanjut: foreach Vs foreachPartitions Kapan menggunakan What?
sumber
map
ataumapPartitions
untuk mencapai hasil yang sama (lihat dua contoh dalam pertanyaan); pertanyaan ini adalah tentang mengapa Anda memilih satu cara dari yang lain. Komentar di jawaban lain sangat berguna! Juga, Anda tidak menyebutkan bahwamap
danflatMap
lulusfalse
untukpreservesPartitioning
, dan apa implikasi dari yang.map
lebih baik daripadamapPartitions
? JikamapPartitions
begitu bagus, mengapa implementasi peta tidak standar?Peta :
MapPartitions
sumber