Perbedaan antara DataFrame, Dataset, dan RDD di Spark

257

Saya hanya ingin tahu apa perbedaan antara sebuah RDDdan DataFrame (Spark 2.0.0 DataFrame adalah tipe alias untuk Dataset[Row]) di Apache Spark?

Bisakah Anda mengonversi satu ke yang lain?

oikonomiyaki
sumber

Jawaban:

232

A DataFramedidefinisikan 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 DataFramememiliki 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 RDDvia rddmetode, dan Anda bisa beralih dari suatu RDDke DataFrame(jika RDD dalam format tabular) melalui toDFmetode

Secara umum disarankan untuk menggunakan DataFramejika memungkinkan karena optimasi kueri bawaan.

Justin Pihony
sumber
6
Jawaban tidak memberikan penjelasan tentang dataset. Sesuai Spark- The Definitive Guide, dataset adalah tipe api terstruktur yang aman. Jadi, Anda dapat memberikan jenis skema Anda sebelumnya.
Chintan Pandya
3
Terima kasih - judul dan deskripsi aslinya diedit dengan baik setelah pertanyaan aslinya (yang tidak termasuk Kumpulan Data)
Justin Pihony
219

Hal pertama adalah DataFrameberevolusi dari SchemaRDD.

metode depreated toSchemaRDD

Ya .. konversi antara Dataframedan RDDsangat mungkin.

Berikut ini beberapa cuplikan kode sampel.

  • df.rdd adalah RDD[Row]

Di bawah ini adalah beberapa opsi untuk membuat kerangka data.

  • 1) yourrddOffrow.toDFmengonversi ke DataFrame.

  • 2) Menggunakan createDataFramekonteks 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 scala

import 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 StructTypedan StructField

val schema = new StructType()
  .add(StructField("id", StringType, true))
  .add(StructField("col1", DoubleType, true))
  .add(StructField("col2", DoubleType, true)) etc...

uraian gambar; kesan

Bahkan ada Are Now 3 Apache Spark APIs ..

masukkan deskripsi gambar di sini

  1. RDD API:

The RDD(Resilient Distributed Dataset) API telah di Spark sejak rilis 1.0.

The RDDAPI menyediakan banyak metode transformasi, seperti map(), filter(), dan reduce() untuk melakukan perhitungan pada data. Masing-masing metode ini menghasilkan RDDdata 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 adalah collect() dan saveAsObjectFile().

Contoh RDD:

rdd.filter(_.age > 21) // transformation
   .map(_.last)// transformation
.saveAsObjectFile("under21.bin") // action

Contoh: Saring berdasarkan atribut dengan RDD

rdd.filter(_.age > 21)
  1. DataFrame API

Spark 1.3 memperkenalkan DataFrameAPI baru sebagai bagian dari inisiatif Project Tungsten yang berupaya meningkatkan kinerja dan skalabilitas Spark. The DataFramememperkenalkan 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 DataFrameAPI secara radikal berbeda dari RDDAPI 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 DataFrameAPI adalah bahwa ia sangat scala-sentris dan meskipun mendukung Java, dukungannya terbatas.

Misalnya, ketika membuat objek Java yang DataFramesudah ada RDD, pengoptimal Spark's Catalyst tidak dapat menyimpulkan skema dan mengasumsikan bahwa objek apa pun dalam DataFrame mengimplementasikan scala.Productantarmuka. Scala case classbekerja di luar kotak karena mereka mengimplementasikan antarmuka ini.

  1. Dataset API

The DatasetAPI, 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 dari RDDAPI tetapi dengan manfaat kinerja dari pengoptimal permintaan Catalyst. Kumpulan data juga menggunakan mekanisme penyimpanan off-heap yang sama efisiennya dengan DataFrameAPI.

Ketika datang ke serialisasi data, DatasetAPI 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, DatasetAPI dirancang untuk bekerja sama baiknya dengan Java dan Scala. Ketika bekerja dengan objek Java, penting bahwa mereka sepenuhnya memenuhi syarat kacang.

Contoh Datasetgaya SQL API:

dataset.filter(_.age < 21);

Evaluasi berbeda. antara DataFrame& DataSet: masukkan deskripsi gambar di sini

Aliran tingkat katalis. . (Demistifying DataFrame dan presentasi Dataset dari percikan puncak) masukkan deskripsi gambar di sini

Bacaan lebih lanjut ... artikel databricks - Kisah Tiga API Apache Spark: RDD vs DataFrames dan Kumpulan Data

Ram Ghadiyaram
sumber
Apa struktur Dataset yang diketik dengan kuat? Apa bedanya dengan DataFrame?
Arvind Kumar
Kesalahan Analisis macam apa yang tercakup dalam Kumpulan Data?
Neeleshkumar S
5
@ neelesh-srinivasan: ambil contoh dalam sintaks dataframe 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.
Ram Ghadiyaram
@NeeleshSrinivasan: untuk informasi dan perincian lebih lanjut, lihat perbandingan apache-spark-api-api
Ram Ghadiyaram
Gambar pertama menyesatkan. Kumpulan data tidak tersedia dalam Python
Yeikel
136

Apache Spark menyediakan tiga jenis API

  1. RDD
  2. DataFrame
  3. Himpunan data

Membandingkan RDD, Dataframe, dan API Data

Berikut ini adalah perbandingan API antara RDD, Dataframe dan Dataset.

RDD

Spark abstraksi utama menyediakan adalah dataset didistribusikan tangguh (RDD), yang merupakan kumpulan elemen yang dipartisi di seluruh node cluster yang dapat dioperasikan secara paralel.

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.

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.

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,

     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.

Batasan Dataframe: -

  • Jenis keamanan waktu kompilasi: Seperti dibahas, Dataframe API tidak mendukung keamanan waktu kompilasi yang membatasi Anda untuk memanipulasi data saat struktur tidak diketahui. Contoh berikut berfungsi selama waktu kompilasi. Namun, Anda akan mendapatkan pengecualian Runtime saat menjalankan kode ini.

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.

  • Tidak dapat beroperasi di Objek domain (objek domain hilang): Setelah Anda mengubah objek domain menjadi kerangka data, Anda tidak dapat membuat ulang dari itu. Dalam contoh berikut, setelah kami membuat personDF dari personRDD, kami tidak akan memulihkan RDD kelas Person yang asli (RDD [Person]).

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]

API dataset

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.

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:

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]
  • Dapat dioperasikan: Dataset memungkinkan Anda untuk dengan mudah mengubah RDD dan Dataframe yang ada menjadi kumpulan data tanpa kode boilerplate.

Batasan Kumpulan Data: -

  • Membutuhkan casting tipe ke String: Meminta data dari dataset saat ini mengharuskan kami untuk menentukan bidang dalam kelas sebagai string. Setelah kami menanyakan data, kami dipaksa untuk memasukkan kolom ke tipe data yang diperlukan. Di sisi lain, jika kita menggunakan operasi peta pada dataset, itu tidak akan menggunakan pengoptimal Catalyst.

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.

Pembual
sumber
2
Dari spark.apache.org/docs/latest/… , Dalam Scala API, DataFrame hanyalah tipe alias dari Dataset [Row].
Dean Chen
jadi tidak apa-apa untuk mengatakan bahwa dengan dataset, kita mendapatkan keamanan jenis dan kehilangan pengoptimal?
Khoa
@BlueSky Anda mendapatkan keamanan jenis dan masih memiliki pengoptimal
Gabber
@AmitDubey Itu tidak benar. Datasetbukan 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 DatasetAPI. Bergabung hanyalah contoh yang paling menonjol.
zero323
52

Semua (RDD, DataFrame dan DataSet) dalam satu gambar.

RDD vs DataFrame vs DataSet

kredit gambar

RDD

RDD adalah kumpulan elemen yang toleran terhadap kesalahan yang dapat dioperasikan secara paralel.

DataFrame

DataFrameadalah 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

Datasetadalah 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.

RDD vs DataFrame vs DataSet dengan kode

sumber


T: Dapatkah Anda mengonversi satu ke yang lain seperti RDD ke DataFrame atau sebaliknya?

Ya, keduanya mungkin

1. RDDuntuk DataFramedengan.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/ DataSetke RDDdengan .rdd()metode

val rowsRdd: RDD[Row] = df.rdd() // DataFrame to RDD
mrsrinivas
sumber
27

Karena DataFramediketik 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 Columnobjek 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 Peopleobjek, di mana deptIdmerupakan 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 DataFrameakan menjadi jenis alias untuk DataSet[Row].

Yuval Itzchakov
sumber
5
Lebih tepatnya untuk Spark 2.0 Dataframe hanyalah alias untukDataset[Row]
zero323
1
@ zero323 Ya memang, tapi itu masih diketik dengan lemah, itulah yang saya coba sampaikan.
Yuval Itzchakov
Ya, tetapi ini lebih merupakan masalah nilai yang disimpan daripada sebuah wadah itu sendiri. Bahkan di 1.6 keduanya secara teknis identik dan alasan utama untuk tetap terpisah DataFrameadalah untuk menghindari melanggar perubahan API. Lagi pula, hanya ingin menunjukkannya. Terima kasih atas hasil edit dan upvote dari saya.
zero323
25

Sederhananya RDDadalah komponen inti, tetapi DataFramemerupakan API yang diperkenalkan pada percikan 1.30.

RDD

Kumpulan partisi data disebut RDD. Ini RDDharus mengikuti beberapa properti seperti:

  • Kekal,
  • Toleransi salah,
  • Didistribusikan,
  • Lebih.

Di sini RDDterstruktur atau tidak terstruktur.

DataFrame

DataFrameadalah 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 RDDsdalam 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. sampleRDDdipanggil (data mentah) disebut RDD.

Venu A Positif
sumber
12

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

vaquar khan
sumber
8

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.

Silver Blaze
sumber
2
RDD juga malas.
kon psych
6

Beberapa wawasan dari perspektif penggunaan, RDD vs DataFrame:

  1. RDD luar biasa! karena mereka memberi kita semua fleksibilitas untuk menangani hampir semua jenis data; data tidak terstruktur, semi terstruktur dan terstruktur. Karena, seringkali data tidak siap untuk dimasukkan ke dalam DataFrame, (bahkan JSON), RDD dapat digunakan untuk melakukan preprocessing pada data sehingga dapat masuk ke dalam kerangka data. RDD adalah abstraksi data inti di Spark.
  2. Tidak semua transformasi yang dimungkinkan pada RDD dimungkinkan pada DataFrames, contoh kurangi () adalah untuk RDD vs kecuali () adalah untuk DataFrame.
  3. Karena DataFrames seperti tabel relasional, mereka mengikuti aturan ketat ketika menggunakan transformasi set / teori relasional, misalnya jika Anda ingin menyatukan dua kerangka data persyaratannya adalah bahwa kedua dfs memiliki jumlah kolom yang sama dan tipe data kolom terkait. Nama kolom bisa berbeda. Aturan-aturan ini tidak berlaku untuk RDD. Ini adalah tutorial yang bagus untuk menjelaskan fakta-fakta ini.
  4. Ada keuntungan kinerja saat menggunakan DataFrames karena yang lain sudah dijelaskan secara mendalam.
  5. Menggunakan DataFrames Anda tidak perlu melewati fungsi arbitrer seperti yang Anda lakukan saat pemrograman dengan RDD.
  6. Anda memerlukan SQLContext / HiveContext untuk memprogram dataframe karena mereka berada di area SparkSQL dari eco-system percikan, tetapi untuk RDD Anda hanya perlu SparkContext / JavaSparkContext yang terletak di perpustakaan Spark Core.
  7. Anda dapat membuat df dari RDD jika Anda dapat menentukan skema untuk itu.
  8. Anda juga dapat mengonversi df ke rdd dan rdd ke df.

Saya harap ini membantu!

skvyas
sumber
5

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)

Neethu
sumber
1

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 -

masukkan deskripsi gambar di sini

Ajay Ahuja
sumber
0

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
0

Apache Spark - RDD, DataFrame, dan DataSet

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.

RB7
sumber
-1

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)

Raj
sumber
-2

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.

Ashkrit Sharma
sumber