Saya hanya ingin tahu apa perbedaan antara sebuah RDD
dan DataFrame
(Spark 2.0.0 DataFrame adalah tipe alias untuk Dataset[Row]
) di Apache Spark?
Bisakah Anda mengonversi satu ke yang lain?
sumber
Saya hanya ingin tahu apa perbedaan antara sebuah RDD
dan DataFrame
(Spark 2.0.0 DataFrame adalah tipe alias untuk Dataset[Row]
) di Apache Spark?
Bisakah Anda mengonversi satu ke yang lain?
A DataFrame
didefinisikan dengan baik dengan pencarian google untuk "Definisi DataFrame":
Frame data adalah tabel, atau struktur dua dimensi seperti array, di mana setiap kolom berisi pengukuran pada satu variabel, dan setiap baris berisi satu case.
Jadi, a DataFrame
memiliki metadata tambahan karena format tabularnya, yang memungkinkan Spark menjalankan optimisasi tertentu pada kueri final.
Sebuah RDD
, di sisi lain, hanyalah R esilient D istributed D ataset yang lebih dari blackbox data yang tidak dapat dioptimalkan sebagai operasi yang dapat dilakukan terhadap itu, yang tidak dibatasi.
Namun, Anda bisa pergi dari DataFrame ke RDD
via rdd
metode, dan Anda bisa beralih dari suatu RDD
ke DataFrame
(jika RDD dalam format tabular) melalui toDF
metode
Secara umum disarankan untuk menggunakan DataFrame
jika memungkinkan karena optimasi kueri bawaan.
Ya .. konversi antara
Dataframe
danRDD
sangat mungkin.Berikut ini beberapa cuplikan kode sampel.
df.rdd
adalahRDD[Row]
Di bawah ini adalah beberapa opsi untuk membuat kerangka data.
1)
yourrddOffrow.toDF
mengonversi keDataFrame
.2) Menggunakan
createDataFrame
konteks sqlval df = spark.createDataFrame(rddOfRow, schema)
Bahkan ada Are Now 3 Apache Spark APIs ..
RDD
API:Contoh RDD:
Contoh: Saring berdasarkan atribut dengan RDD
DataFrame
APIContoh gaya SQL:
df.filter("age > 21");
Keterbatasan: Karena kode mengacu pada atribut data berdasarkan nama, tidak mungkin bagi kompiler untuk menangkap kesalahan. Jika nama atribut salah maka kesalahan hanya akan terdeteksi pada saat runtime, ketika rencana kueri dibuat.
Kelemahan lain dengan
DataFrame
API adalah bahwa ia sangat scala-sentris dan meskipun mendukung Java, dukungannya terbatas.Misalnya, ketika membuat objek Java yang
DataFrame
sudah adaRDD
, pengoptimal Spark's Catalyst tidak dapat menyimpulkan skema dan mengasumsikan bahwa objek apa pun dalam DataFrame mengimplementasikanscala.Product
antarmuka. Scalacase class
bekerja di luar kotak karena mereka mengimplementasikan antarmuka ini.Dataset
APIContoh
Dataset
gaya SQL API:Evaluasi berbeda. antara
DataFrame
&DataSet
:Aliran tingkat katalis. . (Demistifying DataFrame dan presentasi Dataset dari percikan puncak)
Bacaan lebih lanjut ... artikel databricks - Kisah Tiga API Apache Spark: RDD vs DataFrames dan Kumpulan Data
sumber
df.filter("age > 21");
ini dapat dievaluasi / dianalisis hanya pada waktu berjalan. sejak stringnya. Jika Dataset, Dataset sesuai dengan kacang. jadi umur adalah properti kacang. jika properti umur tidak ada di kacang Anda, maka Anda akan tahu di awal waktu kompilasi yaitu (yaitudataset.filter(_.age < 21);
). Kesalahan analisis dapat diubah namanya menjadi Kesalahan evaluasi.Apache Spark menyediakan tiga jenis API
Berikut ini adalah perbandingan API antara RDD, Dataframe dan Dataset.
RDD
Fitur RDD: -
Koleksi terdistribusi:
RDD menggunakan operasi MapReduce yang secara luas diadopsi untuk memproses dan menghasilkan dataset besar dengan algoritma terdistribusi paralel pada sebuah cluster. Ini memungkinkan pengguna untuk menulis komputasi paralel, menggunakan seperangkat operator tingkat tinggi, tanpa harus khawatir tentang distribusi pekerjaan dan toleransi kesalahan.
Immutable : RDD terdiri dari koleksi catatan yang dipartisi. Partisi adalah unit dasar paralelisme dalam RDD, dan setiap partisi adalah satu divisi logis dari data yang tidak berubah dan dibuat melalui beberapa transformasi pada partisi yang ada. Ketidakmampuan membantu untuk mencapai konsistensi dalam perhitungan.
Toleransi kesalahan: Dalam kasus kita kehilangan beberapa partisi RDD, kita dapat memutar ulang transformasi pada partisi tersebut dalam garis keturunan untuk mencapai perhitungan yang sama, daripada melakukan replikasi data di beberapa node. Karakteristik ini adalah manfaat terbesar RDD karena menghemat banyak upaya dalam manajemen data dan replikasi dan dengan demikian mencapai perhitungan yang lebih cepat.
Evaluasi malas: Semua transformasi dalam Spark malas, karena mereka tidak menghitung hasilnya segera. Sebagai gantinya, mereka hanya mengingat transformasi yang diterapkan pada beberapa dataset dasar. Transformasi hanya dihitung ketika suatu tindakan membutuhkan hasil untuk dikembalikan ke program driver.
Transformasi fungsional: RDD mendukung dua jenis operasi: transformasi, yang membuat dataset baru dari yang sudah ada, dan tindakan, yang mengembalikan nilai ke program driver setelah menjalankan perhitungan pada dataset.
Format pemrosesan data:
Ini dapat dengan mudah dan efisien memproses data yang terstruktur serta data tidak terstruktur.
Bahasa Pemrograman yang didukung:
RDD API tersedia di Java, Scala, Python, dan R.
Batasan RDD: -
Tidak ada mesin optimisasi internal : Ketika bekerja dengan data terstruktur, RDD tidak dapat mengambil keuntungan dari pengoptimal canggih Spark termasuk pengoptimal katalis dan mesin eksekusi Tungsten. Pengembang perlu mengoptimalkan setiap RDD berdasarkan atributnya.
Menangani data terstruktur: Tidak seperti Dataframe dan dataset, RDD tidak menyimpulkan skema dari data yang dicerna dan mengharuskan pengguna untuk menentukannya.
Kerangka data
Spark memperkenalkan Dataframe dalam rilis Spark 1.3. Dataframe mengatasi tantangan utama yang dimiliki RDD.
Fitur Dataframe: -
Koleksi Terdistribusi dari Objek Baris: DataFrame adalah kumpulan data terdistribusi yang diorganisasikan ke dalam kolom bernama. Secara konseptual setara dengan tabel dalam database relasional, tetapi dengan optimasi yang lebih kaya di bawah tenda.
Pemrosesan Data: Memproses format data terstruktur dan tidak terstruktur (Avro, CSV, pencarian elastis, dan Cassandra) dan sistem penyimpanan (HDFS, tabel HIVE, MySQL, dll). Itu dapat membaca dan menulis dari semua berbagai sumber data ini.
Pengoptimalan menggunakan pengoptimal katalis: Memberdayakan kueri SQL dan API DataFrame. Dataframe menggunakan kerangka transformasi pohon katalis dalam empat fase,
Kompatibilitas Hive: Menggunakan Spark SQL, Anda dapat menjalankan kueri Hive yang tidak dimodifikasi di gudang Hive yang ada. Ini menggunakan kembali Hive frontend dan MetaStore dan memberi Anda kompatibilitas penuh dengan data Hive yang ada, kueri, dan UDF.
Tungsten: Tungsten menyediakan backend eksekusi fisik yang secara eksplisit mengelola memori dan secara dinamis menghasilkan bytecode untuk evaluasi ekspresi.
Bahasa Pemrograman yang didukung:
Dataframe API tersedia di Java, Scala, Python, dan R.
Batasan Dataframe: -
Contoh:
Ini menantang khususnya ketika Anda bekerja dengan beberapa langkah transformasi dan agregasi.
Contoh:
API dataset
Fitur Dataset: -
Memberikan yang terbaik dari RDD dan Dataframe: RDD (pemrograman fungsional, tipe aman), DataFrame (model relasional, optimalisasi kueri, eksekusi Tungsten, pengurutan, dan pengacakan)
Encoders: Dengan menggunakan Encoders, mudah untuk mengubah objek JVM menjadi Dataset, memungkinkan pengguna untuk bekerja dengan data terstruktur dan tidak terstruktur seperti Dataframe.
Bahasa Pemrograman yang didukung: Datasets API saat ini hanya tersedia di Scala dan Java. Python dan R saat ini tidak didukung di versi 1.6. Dukungan Python dijadwalkan untuk versi 2.0.
Jenis Keamanan: API Data menyediakan keamanan waktu kompilasi yang tidak tersedia di Dataframe. Pada contoh di bawah ini, kita dapat melihat bagaimana Dataset dapat beroperasi pada objek domain dengan kompilasi fungsi lambda.
Contoh:
Batasan Kumpulan Data: -
Contoh:
Tidak ada dukungan untuk Python dan R: Pada rilis 1.6, Kumpulan data hanya mendukung Scala dan Java. Dukungan Python akan diperkenalkan di Spark 2.0.
Datasets API membawa beberapa keunggulan dibandingkan RDD dan Dataframe API yang ada dengan keamanan jenis dan pemrograman fungsional yang lebih baik. Dengan tantangan persyaratan pengecoran tipe dalam API, Anda masih tidak akan mendapatkan keamanan jenis yang diperlukan dan akan membuat kode Anda rapuh.
sumber
Dataset
bukan LINQ dan ekspresi lambda tidak dapat diartikan sebagai pohon ekspresi. Oleh karena itu, ada kotak hitam, dan Anda kehilangan hampir semua (jika tidak semua) manfaat pengoptimal. Hanya sebagian kecil dari kemungkinan kerugian: Spark 2.0 Dataset vs DataFrame . Juga, hanya untuk mengulangi sesuatu yang saya nyatakan berulang kali - pada umumnya pengecekan jenis ujung ke ujung tidak dimungkinkan denganDataset
API. Bergabung hanyalah contoh yang paling menonjol.Semua (RDD, DataFrame dan DataSet) dalam satu gambar.
kredit gambar
RDD
DataFrame
Dataset
Nice comparison of all of them with a code snippet.
sumber
Ya, keduanya mungkin
1.
RDD
untukDataFrame
dengan.toDF()
lebih banyak cara: Konversi objek RDD ke Dataframe di Spark
2.
DataFrame
/DataSet
keRDD
dengan.rdd()
metodesumber
Karena
DataFrame
diketik dengan lemah dan pengembang tidak mendapatkan manfaat dari sistem tipe. Misalnya, katakanlah Anda ingin membaca sesuatu dari SQL dan menjalankan beberapa agregasi di atasnya:Ketika Anda mengatakan
people("deptId")
, Anda tidak mendapatkan kembaliInt
, atauLong
, Anda mendapatkan kembaliColumn
objek yang Anda butuhkan untuk beroperasi. Dalam bahasa dengan sistem tipe kaya seperti Scala, Anda akhirnya kehilangan semua keamanan jenis yang meningkatkan jumlah kesalahan run-time untuk hal-hal yang dapat ditemukan pada waktu kompilasi.Sebaliknya,
DataSet[T]
diketik. saat kamu melakukan:Anda benar-benar mendapatkan kembali
People
objek, di manadeptId
merupakan tipe integral yang sebenarnya dan bukan tipe kolom, sehingga mengambil keuntungan dari sistem tipe.Pada Spark 2.0, DataFrame dan API DataSet akan disatukan, di mana
DataFrame
akan menjadi jenis alias untukDataSet[Row]
.sumber
Dataframe
hanyalah alias untukDataset[Row]
DataFrame
adalah untuk menghindari melanggar perubahan API. Lagi pula, hanya ingin menunjukkannya. Terima kasih atas hasil edit dan upvote dari saya.Sederhananya
RDD
adalah komponen inti, tetapiDataFrame
merupakan API yang diperkenalkan pada percikan 1.30.RDD
Kumpulan partisi data disebut
RDD
. IniRDD
harus mengikuti beberapa properti seperti:Di sini
RDD
terstruktur atau tidak terstruktur.DataFrame
DataFrame
adalah API yang tersedia dalam Scala, Java, Python, dan R. Memungkinkan untuk memproses semua jenis data Terstruktur dan semi terstruktur. Untuk mendefinisikanDataFrame
, kumpulan data terdistribusi diatur ke dalam kolom bernama bernamaDataFrame
. Anda dapat dengan mudah mengoptimalkanRDDs
dalamDataFrame
. Anda dapat memproses data JSON, data parket, data HiveQL sekaligus menggunakanDataFrame
.Di sini Sample_DF dianggap sebagai
DataFrame
.sampleRDD
dipanggil (data mentah) disebutRDD
.sumber
Sebagian besar jawaban benar hanya ingin menambahkan satu poin di sini
Di Spark 2.0, dua API (DataFrame + DataSet) akan disatukan menjadi satu API.
"Menyatukan DataFrame dan Dataset: Di Scala dan Java, DataFrame dan Dataset telah disatukan, yaitu DataFrame hanya tipe alias untuk Dataset of Row. Dalam Python dan R, mengingat kurangnya jenis keamanan, DataFrame adalah antarmuka pemrograman utama."
Namun, dataset mirip dengan RDD, alih-alih menggunakan serialisasi Java atau Kryo, mereka menggunakan Encoder khusus untuk membuat serialisasi objek untuk diproses atau dikirim melalui jaringan.
Spark SQL mendukung dua metode berbeda untuk mengubah RDD yang ada menjadi Kumpulan Data. Metode pertama menggunakan refleksi untuk menyimpulkan skema RDD yang berisi jenis objek tertentu. Pendekatan berbasis refleksi ini mengarah pada kode yang lebih ringkas dan berfungsi dengan baik ketika Anda sudah tahu skema saat menulis aplikasi Spark Anda.
Metode kedua untuk membuat Kumpulan Data adalah melalui antarmuka terprogram yang memungkinkan Anda membuat skema dan kemudian menerapkannya ke RDD yang ada. Meskipun metode ini lebih verbose, metode ini memungkinkan Anda untuk membangun Kumpulan Data ketika kolom dan tipenya tidak dikenal hingga runtime.
Di sini Anda dapat menemukan RDD untuk jawaban percakapan bingkai data
Bagaimana mengkonversi objek rdd ke dataframe di spark
sumber
DataFrame setara dengan tabel dalam RDBMS dan juga dapat dimanipulasi dengan cara yang mirip dengan koleksi "asli" yang didistribusikan di RDD. Tidak seperti RDD, Dataframe melacak skema dan mendukung berbagai operasi relasional yang mengarah pada eksekusi yang lebih optimal. Setiap objek DataFrame mewakili rencana logis tetapi karena sifatnya "malas" tidak ada eksekusi yang terjadi sampai pengguna memanggil "operasi output" tertentu.
sumber
Beberapa wawasan dari perspektif penggunaan, RDD vs DataFrame:
Saya harap ini membantu!
sumber
Dataframe adalah RDD objek Row, masing-masing mewakili catatan. Dataframe juga mengetahui skema (yaitu, bidang data) dari barisnya. Sementara Dataframe terlihat seperti RDD biasa, secara internal mereka menyimpan data dengan cara yang lebih efisien, mengambil keuntungan dari skema mereka. Selain itu, mereka menyediakan operasi baru yang tidak tersedia di RDD, seperti kemampuan untuk menjalankan query SQL. Kerangka data dapat dibuat dari sumber data eksternal, dari hasil kueri, atau dari RDD biasa.
Referensi: Zaharia M., et al. Learning Spark (O'Reilly, 2015)
sumber
Spark RDD (resilient distributed dataset)
:RDD adalah API abstraksi data inti dan tersedia sejak rilis pertama Spark (Spark 1.0). Ini adalah API tingkat rendah untuk memanipulasi pengumpulan data terdistribusi. RDD API memperlihatkan beberapa metode yang sangat berguna yang dapat digunakan untuk mendapatkan kontrol yang sangat ketat atas struktur data fisik yang mendasarinya. Ini adalah koleksi data partisi yang tidak dapat diubah (hanya baca) yang didistribusikan pada mesin yang berbeda. RDD memungkinkan perhitungan dalam memori pada kelompok besar untuk mempercepat pemrosesan data besar dengan cara yang toleran terhadap kesalahan. Untuk memungkinkan toleransi kesalahan, RDD menggunakan DAG (Directed Acyclic Graph) yang terdiri dari satu set simpul dan tepi. Vertikal dan tepi dalam DAG mewakili RDD dan operasi yang akan diterapkan pada RDD itu masing-masing. Transformasi yang didefinisikan pada RDD adalah malas dan dijalankan hanya ketika suatu tindakan dipanggil
Spark DataFrame
:Spark 1.3 memperkenalkan dua API abstraksi data baru - DataFrame dan DataSet. API DataFrame mengatur data ke dalam kolom bernama seperti tabel dalam basis data relasional. Ini memungkinkan programmer untuk menentukan skema pada kumpulan data yang terdistribusi. Setiap baris dalam DataFrame adalah baris tipe objek. Seperti tabel SQL, setiap kolom harus memiliki jumlah baris yang sama dalam DataFrame. Singkatnya, DataFrame adalah rencana malas dievaluasi yang menentukan operasi yang perlu dilakukan pada pengumpulan data yang didistribusikan. DataFrame juga merupakan koleksi yang tidak dapat diubah.
Spark DataSet
:Sebagai ekstensi ke API DataFrame, Spark 1.3 juga memperkenalkan API DataSet yang menyediakan antarmuka pemrograman berorientasi objek dan diketik ketat di Spark. Ini adalah koleksi data terdistribusi yang tidak berubah dan aman-tipe. Seperti DataFrame, API DataSet juga menggunakan mesin Catalyst untuk memungkinkan optimasi eksekusi. DataSet adalah ekstensi untuk API DataFrame.
Other Differences
-sumber
Sebuah DataFrame adalah RDD yang memiliki skema. Anda bisa menganggapnya sebagai tabel database relasional, di mana setiap kolom memiliki nama dan tipe yang dikenal. Kekuatan DataFrames berasal dari kenyataan bahwa, ketika Anda membuat DataFrame dari dataset terstruktur (Json, Parket ..), Spark dapat menyimpulkan skema dengan membuat melewati seluruh (Json, Parket ..) dataset yang sedang dimuat. Kemudian, ketika menghitung rencana eksekusi, Spark, dapat menggunakan skema dan melakukan optimisasi perhitungan yang jauh lebih baik. Perhatikan bahwa DataFrame disebut SchemaRDD sebelum Spark v1.3.0
sumber
Apache Spark - RDD, DataFrame, dan DataSet
Spark RDD -
Spark Dataframe -
Spark Dataset -
sumber
Anda dapat menggunakan RDD dengan Terstruktur dan tidak terstruktur dimana Dataframe / Dataset hanya dapat memproses Data Terstruktur dan Semi Terstruktur (Ini memiliki skema yang tepat)
sumber
Semua jawaban yang bagus dan menggunakan setiap API memiliki beberapa trade off. Dataset dibangun menjadi API super untuk menyelesaikan banyak masalah tetapi berkali-kali RDD masih berfungsi dengan baik jika Anda memahami data Anda dan jika algoritma pemrosesan dioptimalkan untuk melakukan banyak hal dalam Single pass ke data besar maka RDD tampaknya merupakan pilihan terbaik.
Agregasi menggunakan dataset API masih mengkonsumsi memori dan akan menjadi lebih baik seiring waktu.
sumber