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?
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?
Jawaban:
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.
Hal pertama adalah
DataFrame
berevolusi dariSchemaRDD
.
Ya .. konversi antara Dataframe
dan RDD
sangat mungkin.
Berikut ini beberapa cuplikan kode sampel.
df.rdd
adalah RDD[Row]
Di bawah ini adalah beberapa opsi untuk membuat kerangka data.
1) yourrddOffrow.toDF
mengonversi ke DataFrame
.
2) Menggunakan createDataFrame
konteks sql
val df = spark.createDataFrame(rddOfRow, schema)
di mana skema dapat dari beberapa opsi di bawah ini seperti yang dijelaskan oleh posting SO bagus ..
Dari kelas kasus scala dan api refleksi scalaimport org.apache.spark.sql.catalyst.ScalaReflection val schema = ScalaReflection.schemaFor[YourScalacaseClass].dataType.asInstanceOf[StructType]
ATAU menggunakan
Encoders
import org.apache.spark.sql.Encoders val mySchema = Encoders.product[MyCaseClass].schema
seperti yang dijelaskan oleh Skema juga dapat dibuat menggunakan
StructType
danStructField
val schema = new StructType() .add(StructField("id", StringType, true)) .add(StructField("col1", DoubleType, true)) .add(StructField("col2", DoubleType, true)) etc...
Bahkan ada Are Now 3 Apache Spark APIs ..
RDD
API:The
RDD
(Resilient Distributed Dataset) API telah di Spark sejak rilis 1.0.The
RDD
API menyediakan banyak metode transformasi, sepertimap
(),filter
(), danreduce
() untuk melakukan perhitungan pada data. Masing-masing metode ini menghasilkanRDD
data baru yang mewakili data yang diubah. Namun, metode ini hanya mendefinisikan operasi yang akan dilakukan dan transformasi tidak dilakukan sampai metode tindakan dipanggil. Contoh metode tindakan adalahcollect
() dansaveAsObjectFile
().
Contoh RDD:
rdd.filter(_.age > 21) // transformation
.map(_.last)// transformation
.saveAsObjectFile("under21.bin") // action
Contoh: Saring berdasarkan atribut dengan RDD
rdd.filter(_.age > 21)
DataFrame
APISpark 1.3 memperkenalkan
DataFrame
API baru sebagai bagian dari inisiatif Project Tungsten yang berupaya meningkatkan kinerja dan skalabilitas Spark. TheDataFrame
memperkenalkan API konsep skema untuk menggambarkan data, yang memungkinkan Spark untuk mengelola skema dan hanya melewatkan data antara node, dalam cara yang jauh lebih efisien daripada menggunakan serialisasi Jawa.The
DataFrame
API secara radikal berbeda dariRDD
API karena merupakan API untuk membangun rencana query relasional yang Spark Catalyst optimizer kemudian dapat mengeksekusi. API itu alami untuk pengembang yang terbiasa dengan rencana pembuatan kueri
Contoh 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 ada RDD
, pengoptimal Spark's Catalyst tidak dapat menyimpulkan skema dan mengasumsikan bahwa objek apa pun dalam DataFrame mengimplementasikan scala.Product
antarmuka. Scala case class
bekerja di luar kotak karena mereka mengimplementasikan antarmuka ini.
Dataset
APIThe
Dataset
API, dirilis sebagai API pratinjau di Spark 1.6, bertujuan untuk memberikan yang terbaik dari kedua dunia; gaya pemrograman berorientasi objek yang familier dan tipe-kompilasi-keselamatan-waktu dariRDD
API tetapi dengan manfaat kinerja dari pengoptimal permintaan Catalyst. Kumpulan data juga menggunakan mekanisme penyimpanan off-heap yang sama efisiennya denganDataFrame
API.Ketika datang ke serialisasi data,
Dataset
API memiliki konsep encoders yang menerjemahkan antara representasi (objek) JVM dan format biner internal Spark. Spark memiliki encoders bawaan yang sangat canggih karena mereka menghasilkan kode byte untuk berinteraksi dengan data yang tidak ditumpuk dan menyediakan akses sesuai permintaan ke atribut individual tanpa harus menderialisasi seluruh objek. Spark belum menyediakan API untuk menerapkan penyandiaksaraan khusus, tetapi itu direncanakan untuk rilis di masa mendatang.Selain itu,
Dataset
API dirancang untuk bekerja sama baiknya dengan Java dan Scala. Ketika bekerja dengan objek Java, penting bahwa mereka sepenuhnya memenuhi syarat kacang.
Contoh Dataset
gaya SQL API:
dataset.filter(_.age < 21);
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
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 (yaitu dataset.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.
Spark abstraksi utama menyediakan adalah dataset didistribusikan tangguh (RDD), yang merupakan kumpulan elemen yang dipartisi di seluruh node cluster yang dapat dioperasikan secara paralel.
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.
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.
Spark memperkenalkan Dataframe dalam rilis Spark 1.3. Dataframe mengatasi tantangan utama yang dimiliki RDD.
DataFrame adalah kumpulan data terdistribusi yang diorganisasikan ke dalam kolom bernama. Secara konseptual setara dengan tabel dalam database relasional atau R / Python Dataframe. Bersama dengan Dataframe, Spark juga memperkenalkan pengoptimal katalis, yang memanfaatkan fitur pemrograman canggih untuk membangun pengoptimal permintaan yang dapat diperluas.
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,
1.Analyzing a logical plan to resolve references
2.Logical plan optimization
3.Physical planning
4.Code generation to compile parts of the query to Java bytecode.
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.
Contoh:
case class Person(name : String , age : Int)
val dataframe = sqlContext.read.json("people.json")
dataframe.filter("salary > 10000").show
=> throws Exception : cannot resolve 'salary' given input age , name
Ini menantang khususnya ketika Anda bekerja dengan beberapa langkah transformasi dan agregasi.
Contoh:
case class Person(name : String , age : Int)
val personRDD = sc.makeRDD(Seq(Person("A",10),Person("B",20)))
val personDF = sqlContext.createDataframe(personRDD)
personDF.rdd // returns RDD[Row] , does not returns RDD[Person]
Dataset API adalah ekstensi untuk DataFrames yang menyediakan antarmuka pemrograman berorientasi tipe yang aman. Ini adalah koleksi objek yang sangat diketik dan tidak dapat diubah yang dipetakan ke skema relasional.
Pada inti Dataset, API adalah konsep baru yang disebut encoder, yang bertanggung jawab untuk mengkonversi antara objek JVM dan representasi tabel. Representasi tabular disimpan menggunakan format binary Tungsten internal Spark, memungkinkan untuk operasi pada data serial dan peningkatan pemanfaatan memori. Spark 1.6 hadir dengan dukungan untuk menghasilkan enkoder secara otomatis untuk berbagai jenis, termasuk tipe primitif (mis. String, Integer, Long), kelas case Scala, dan Java Beans.
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:
case class Person(name : String , age : Int)
val personRDD = sc.makeRDD(Seq(Person("A",10),Person("B",20)))
val personDF = sqlContext.createDataframe(personRDD)
val ds:Dataset[Person] = personDF.as[Person]
ds.filter(p => p.age > 25)
ds.filter(p => p.salary > 25)
// error : value salary is not a member of person
ds.rdd // returns RDD[Person]
Contoh:
ds.select(col("name").as[String], $"age".as[Int]).collect()
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.
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 dengan Dataset
API. Bergabung hanyalah contoh yang paling menonjol.
RDD
RDD
adalah kumpulan elemen yang toleran terhadap kesalahan yang dapat dioperasikan secara paralel.
DataFrame
DataFrame
adalah Dataset yang disusun dalam kolom bernama. Secara konseptual setara dengan tabel dalam database relasional atau bingkai data dalam R / Python, tetapi dengan optimisasi yang lebih kaya di bawah tenda .
Dataset
Dataset
adalah kumpulan data yang didistribusikan. Dataset adalah antarmuka baru yang ditambahkan pada Spark 1.6 yang memberikan manfaat RDD (pengetikan yang kuat, kemampuan untuk menggunakan fungsi lambda yang kuat) dengan manfaat dari mesin eksekusi Spark SQL yang dioptimalkan .
catatan:
Kumpulan Data Baris (
Dataset[Row]
) di Scala / Java akan sering disebut sebagai DataFrames .
Nice comparison of all of them with a code snippet.
T: Dapatkah Anda mengonversi satu ke yang lain seperti RDD ke DataFrame atau sebaliknya?
1. RDD
untuk DataFrame
dengan.toDF()
val rowsRdd: RDD[Row] = sc.parallelize(
Seq(
Row("first", 2.0, 7.0),
Row("second", 3.5, 2.5),
Row("third", 7.0, 5.9)
)
)
val df = spark.createDataFrame(rowsRdd).toDF("id", "val1", "val2")
df.show()
+------+----+----+
| id|val1|val2|
+------+----+----+
| first| 2.0| 7.0|
|second| 3.5| 2.5|
| third| 7.0| 5.9|
+------+----+----+
lebih banyak cara: Konversi objek RDD ke Dataframe di Spark
2. DataFrame
/ DataSet
ke RDD
dengan .rdd()
metode
val rowsRdd: RDD[Row] = df.rdd() // DataFrame to RDD
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:
val people = sqlContext.read.parquet("...")
val department = sqlContext.read.parquet("...")
people.filter("age > 30")
.join(department, people("deptId") === department("id"))
.groupBy(department("name"), "gender")
.agg(avg(people("salary")), max(people("age")))
Ketika Anda mengatakan people("deptId")
, Anda tidak mendapatkan kembali Int
, atau Long
, Anda mendapatkan kembali Column
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:
val people: People = val people = sqlContext.read.parquet("...").as[People]
Anda benar-benar mendapatkan kembali People
objek, di mana deptId
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 untuk DataSet[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, tetapi DataFrame
merupakan API yang diperkenalkan pada percikan 1.30.
Kumpulan partisi data disebut RDD
. Ini RDD
harus mengikuti beberapa properti seperti:
Di sini RDD
terstruktur atau tidak terstruktur.
DataFrame
adalah API yang tersedia dalam Scala, Java, Python, dan R. Memungkinkan untuk memproses semua jenis data Terstruktur dan semi terstruktur. Untuk mendefinisikan DataFrame
, kumpulan data terdistribusi diatur ke dalam kolom bernama bernama DataFrame
. Anda dapat dengan mudah mengoptimalkan RDDs
dalam DataFrame
. Anda dapat memproses data JSON, data parket, data HiveQL sekaligus menggunakan DataFrame
.
val sampleRDD = sqlContext.jsonFile("hdfs://localhost:9000/jsondata.json")
val sample_DF = sampleRDD.toDF()
Di sini Sample_DF dianggap sebagai DataFrame
. sampleRDD
dipanggil (data mentah) disebut RDD
.
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
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.
Saya harap ini membantu!
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)
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
-
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
Spark RDD -
RDD adalah singkatan dari Dataset Terdistribusi Tangguh. Ini adalah kumpulan catatan read-only. RDD adalah struktur data dasar Spark. Hal ini memungkinkan seorang programmer untuk melakukan perhitungan dalam memori pada kelompok besar dengan cara yang toleran terhadap kesalahan. Dengan demikian, percepat tugas.
Spark Dataframe -
Tidak seperti RDD, data disusun dalam kolom bernama. Misalnya tabel dalam database relasional. Ini adalah kumpulan data terdistribusi yang tidak berubah. DataFrame di Spark memungkinkan pengembang untuk memaksakan struktur ke kumpulan data terdistribusi, memungkinkan abstraksi tingkat yang lebih tinggi.
Spark Dataset -
Kumpulan data di Apache Spark adalah ekstensi API DataFrame yang menyediakan antarmuka pemrograman berorientasi jenis objek. Dataset mengambil keuntungan dari pengoptimal Spark's Catalyst dengan memaparkan ekspresi dan bidang data ke perencana kueri.
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.