Dapatkah seseorang menjelaskan kepada saya perbedaan antara peta dan flatMap dan apa gunanya kasus yang baik untuk masing-masing?
Apa yang dimaksud dengan "meratakan hasil"? Apa gunanya?
apache-spark
Eran Witkon
sumber
sumber
RDD.map
danRDD.flatMap
di Apache Spark . Secara umum, operasi RDD Spark dimodelkan setelah operasi pengumpulan Scala yang sesuai. Jawaban di stackoverflow.com/q/1059776/590203 , yang membahas perbedaan antaramap
danflatMap
di Scala, mungkin bermanfaat bagi Anda.Jawaban:
Berikut adalah contoh perbedaannya, sebagai
spark-shell
sesi:Pertama, beberapa data - dua baris teks:
Sekarang,
map
mengubah RDD panjang N menjadi RDD panjang N.Misalnya, memetakan dari dua garis menjadi dua panjang garis:
Tetapi
flatMap
(secara longgar) mengubah RDD dengan panjang N menjadi koleksi koleksi N, kemudian meratakannya menjadi RDD tunggal hasil.Kami memiliki beberapa kata per baris, dan beberapa baris, tetapi kami berakhir dengan satu array output kata
Hanya untuk menggambarkan itu, pemetaan datar dari kumpulan garis ke kumpulan kata-kata terlihat seperti:
Oleh karena itu, RDD input dan output biasanya memiliki ukuran yang berbeda untuk
flatMap
.Jika kami mencoba menggunakan
map
dengansplit
fungsi kami , kami akan berakhir dengan struktur bersarang (RDD array kata, dengan tipeRDD[Array[String]]
) karena kami harus memiliki satu hasil per input:Akhirnya, satu kasus khusus yang berguna adalah pemetaan dengan fungsi yang mungkin tidak mengembalikan jawaban, dan karenanya mengembalikan sebuah
Option
. Kita dapat menggunakanflatMap
untuk memfilter elemen yang mengembalikanNone
dan mengekstrak nilai dari yang mengembalikanSome
:(mencatat di sini bahwa Opsi berperilaku lebih seperti daftar yang memiliki satu elemen, atau elemen nol)
sumber
["a b c", "", "d"] => [["a","b","c"],[],["d"]]
?split
atas daftar Strings akan menghasilkan Daftar Array)Secara umum kami menggunakan contoh jumlah kata dalam hadoop. Saya akan menggunakan use case yang sama dan akan menggunakan
map
danflatMap
dan kita akan melihat perbedaan bagaimana memproses data.Di bawah ini adalah file data sampel.
File di atas akan diuraikan menggunakan
map
danflatMap
.Menggunakan
map
Input memiliki 4 baris dan ukuran output adalah 4 juga, yaitu, elemen N ==> elemen N.
Menggunakan
flatMap
Outputnya berbeda dari peta.
Mari kita menetapkan 1 sebagai nilai untuk setiap kunci untuk mendapatkan jumlah kata.
fm
: RDD dibuat dengan menggunakanflatMap
wc
: RDD dibuat menggunakanmap
Sedangkan
flatMap
pada RDDwc
akan memberikan output yang tidak diinginkan di bawah ini:Anda tidak bisa mendapatkan jumlah kata jika
map
digunakan alih-alihflatMap
.Sesuai definisi, perbedaan antara
map
danflatMap
adalah:sumber
.map(lambda line:line.split(" "))
bukan array string. Anda harus mengubahdata.collect()
kewc.collect
dan Anda akan melihat array array.wc.collect()
?Jika Anda menanyakan perbedaan antara RDD.map dan RDD.flatMap di Spark, peta mengubah RDD ukuran N ke yang lain dari ukuran N. misalnya.
misalnya, jika myRDD terdiri dari Doubles.
Sementara flatMap dapat mengubah RDD menjadi antera dengan ukuran berbeda: mis .:
yang akan mengembalikan RDD ukuran 2 * N atau
sumber
Itu bermuara pada pertanyaan awal Anda: apa yang Anda maksud dengan meratakan ?
sumber
Gunakan
test.md
sebagai contoh:Jika Anda menggunakan
map
metode, Anda akan mendapatkan garistest.md
, untukflatMap
metode, Anda akan mendapatkan jumlah kata.The
map
Metode ini mirip denganflatMap
, mereka semua kembali sebuah RDD baru.map
Metode sering menggunakan mengembalikan RDD baru,flatMap
metode sering menggunakan kata-kata split.sumber
map
mengembalikan RDD dengan jumlah elemen yang samaflatMap
mungkin tidak.Contoh kasus penggunaan untuk
flatMap
Menyaring data yang hilang atau salah.Contoh use case untuk
map
Use dalam berbagai kasus dimana jumlah elemen input dan outputnya sama.number.csv
map.py menambahkan semua angka di add.csv.
flatMap.py digunakan
flatMap
untuk menyaring data yang hilang sebelum penambahan. Jumlah yang lebih sedikit ditambahkan dibandingkan dengan versi sebelumnya.sumber
peta dan flatMap serupa, dalam arti mereka mengambil garis dari RDD input dan menerapkan fungsi di atasnya. Perbedaannya adalah bahwa fungsi di peta hanya mengembalikan satu elemen, sedangkan fungsi di flatMap dapat mengembalikan daftar elemen (0 atau lebih) sebagai iterator.
Juga, output dari flatMap diratakan. Meskipun fungsi dalam flatMap mengembalikan daftar elemen, flatMap mengembalikan RDD yang memiliki semua elemen dari daftar dengan cara datar (bukan daftar).
sumber
semua contoh baik .... Berikut ini adalah ilustrasi visual yang bagus ... sumber sumber: Pelatihan dataFlair percikan
Peta: Peta adalah operasi transformasi di Apache Spark. Ini berlaku untuk setiap elemen RDD dan mengembalikan hasilnya sebagai RDD baru. Di Peta, pengembang operasi dapat menentukan logika bisnis kustomnya sendiri. Logika yang sama akan diterapkan ke semua elemen RDD.
map
Fungsi Spark RDD mengambil satu elemen sebagai input, memprosesnya sesuai dengan kode khusus (ditentukan oleh pengembang) dan mengembalikan satu elemen sekaligus. Peta mentransformasikan RDD dengan panjang N menjadi RDD dengan panjang lain dari N. RDD input dan output biasanya akan memiliki jumlah catatan yang sama.Contoh
map
menggunakan scala:FlatMap:
A
flatMap
adalah operasi transformasi. Ini berlaku untuk setiap elemen RDD dan mengembalikan hasilnya seperti baruRDD
. Ini mirip dengan Peta, tetapi FlatMap memungkinkan pengembalian 0, 1 atau lebih elemen dari fungsi peta. Dalam operasi FlatMap, pengembang dapat menentukan logika bisnis kustomnya sendiri. Logika yang sama akan diterapkan ke semua elemen RDD.Fungsi FlatMap mengambil satu elemen sebagai input, memprosesnya sesuai dengan kode khusus (ditentukan oleh pengembang) dan mengembalikan 0 elemen atau lebih sekaligus.
flatMap
() mengubah RDD dengan panjang N menjadi RDD dengan panjang M.Contoh
flatMap
menggunakan scala:sumber
Perbedaannya dapat dilihat dari contoh kode pyspark di bawah ini:
sumber
Flatmap dan Map, keduanya mengubah koleksi.
Perbedaan:
map (func)
Mengembalikan dataset terdistribusi baru yang dibentuk dengan melewatkan setiap elemen dari sumber melalui sebuah fungsi func.
flatMap (func)
Mirip dengan peta, tetapi setiap item input dapat dipetakan ke 0 atau lebih item output (jadi func harus mengembalikan Seq daripada satu item).
Fungsi transformasi:
peta : Satu elemen dalam -> satu elemen keluar.
flatMap : Satu elemen dalam -> 0 elemen atau lebih keluar (koleksi).
sumber
RDD.map
mengembalikan semua elemen dalam array tunggalRDD.flatMap
mengembalikan elemen dalam array arraymari kita asumsikan kita memiliki teks dalam file text.txt sebagai
Menggunakan peta
keluaran:
Menggunakan flatMap
keluaran:
sumber
Untuk semua yang menginginkan PySpark terkait:
Contoh transformasi: flatMap
['Halo apa yang kamu lakukan']
Traceback (panggilan terakhir terakhir): File "", line 1, di AttributeError: objek 'list' tidak memiliki atribut 'split'
[['hello', 'what', 'are', 'you', 'doing'], ['this', 'is', 'rak']]
['hello', 'what', 'are', 'you', 'doing', 'this', 'is', 'rak']
Semoga bermanfaat :)
sumber
map
: Ini mengembalikan yang baruRDD
dengan menerapkan fungsi ke setiap elemenRDD
. Fungsi dalam .map hanya dapat mengembalikan satu item.flatMap
: Mirip dengan peta, ia mengembalikan yang baruRDD
dengan menerapkan fungsi ke setiap elemen RDD, tetapi hasilnya rata.Juga, fungsi dalam
flatMap
dapat mengembalikan daftar elemen (0 atau lebih)Sebagai contoh:
Sumber: https://www.linkedin.com/pulse/difference-between-map-flatmap-transformations-spark-pyspark-pandey/
sumber
peta:
adalah metode tingkat tinggi yang mengambil fungsi sebagai input dan menerapkannya ke setiap elemen dalam RDD sumber.
http://commandstech.com/difference-between-map-and-flatmap-in-spark-what-is-map-and-flatmap-with-examples/
flatMap:
metode tingkat tinggi dan operasi transformasi yang mengambil fungsi input.
sumber
Perbedaan dalam output peta dan flatMap:
1.
flatMap
Keluaran:
2
map
.:Keluaran:
sumber
sementara
sumber