Dataframe Indo
Dataframe Indo
DataFrames
DataFrame adalah kumpulan data terdistribusi yang tidak dapat diubah yang diatur ke dalam kolom
bernama yang analog dengan tabel dalam database relasional. Diperkenalkan sebagai fitur eksperimental
dalam Apache Spark 1.0 sebagai SchemaRDD, mereka diubah namanya menjadi DataFrames sebagai
bagian dari rilis Apache Spark 1.3. Untuk pembaca yang terbiasa dengan Python Pandas DataFrame atau
R DataFrame, Spark DataFrame adalah konsep serupa karena memungkinkan pengguna untuk dengan
mudah bekerja dengan data terstruktur (misalnya, tabel data); Ada beberapa perbedaan juga, jadi tolong
redam harapan Anda.
Dengan memaksakan struktur ke kumpulan data terdistribusi, ini memungkinkan pengguna Spark untuk
mengkueri data terstruktur di Spark SQL atau menggunakan metode ekspresi (bukan lambda). Dalam bab
ini, kita akan menyertakan sampel kode menggunakan kedua metode tersebut. Dengan menyusun data
Anda, ini memungkinkan mesin Apache Spark – khususnya, Catalyst Optimizer – untuk meningkatkan
kinerja kueri Spark secara signifikan. Di API Spark sebelumnya (yaitu, RDD), mengeksekusi kueri di
Python bisa jauh lebih lambat karena overhead komunikasi antara Java JVM dan Py4J.
Note
Jika Anda terbiasa bekerja dengan DataFrame di versi Spark sebelumnya (yaitu Spark 1.x), Anda akan
melihat bahwa di Spark 2.0 kami menggunakan SparkSession alih-alih SQLContext. Berbagai konteks
Spark: HiveContext, SQLContext, StreamingContext, dan SparkContext telah digabungkan bersama di
SparkSession. Dengan cara ini Anda akan bekerja dengan sesi ini hanya sebagai titik masuk untuk
membaca data, bekerja dengan metadata, konfigurasi, dan manajemen sumber daya kluster.
Untuk informasi lebih lanjut, silakan lihat Cara menggunakan SparkSession di Apache Spark
2.0(http://bit.ly/2br0Fr1 ).
Dalam bab ini, Anda akan belajar tentang hal-hal berikut:
Komunikasi Python ke RDD
Penyegaran cepat dari Catalyst Optimizer Spark
Mempercepat PySpark dengan DataFrame
Membuat DataFrame
Kueri DataFrame Sederhana
Interoperasi dengan RDD
Mengkueri dengan DataFrame API
Mengkueri dengan Spark SQL
Menggunakan DataFrame untuk kinerja penerbangan tepat waktu
Komunikasi Python ke RDD (Python to RDD communications)
Setiap kali program PySpark dijalankan menggunakan RDD, ada overhead yang berpotensi besar untuk
mengeksekusi pekerjaan. Seperti yang disebutkan dalam diagram berikut, dalam driver PySpark, Spark
Context menggunakan Py4j untuk meluncurkan JVM menggunakan JavaSparkContext. Setiap
transformasi RDD awalnya dipetakan ke objek PythonRDD di Java.
Setelah tugas-tugas ini didorong ke Spark Worker, objek PythonRDD meluncurkan subproses Python
menggunakan pipa untuk mengirim kode dan data yang akan diproses dalam Python:
Meskipun pendekatan ini memungkinkan PySpark untuk mendistribusikan pemrosesan data ke beberapa
subproses Python pada beberapa pekerja, seperti yang Anda lihat, ada banyak peralihan konteks dan
overhead komunikasi antara Python dan JVM.
Note
Sumber daya yang sangat baik tentang kinerja PySpark adalah Holden Karau Meningkatkan Kinerja
PySpark: Kinerja Spark di luar JVM: http://bit.ly/2bx89bn .
Catalyst Optimizer refresh
Seperti yang disebutkan dalam Bab 1, Memahami Spark, salah satu alasan utama mesin Spark SQL begitu
cepat adalah karena Catalyst Optimizer. Untuk pembaca dengan latar belakang basis data, diagram ini
terlihat mirip dengan perencana logis/fisik dan model biaya/optimalisasi berbasis biaya dari sistem
manajemen basis data relasional (RDBMS):
Pentingnya hal ini adalah, alih-alih segera memproses kueri, Catalyst Optimizer mesin Spark
mengkompilasi dan mengoptimalkan rencana logis dan memiliki pengoptimal biaya yang menentukan
rencana fisik paling efisien yang dihasilkan.
Note
Seperti yang disebutkan di bab-bab sebelumnya, sementara Spark SQL Engine memiliki pengoptimalan
berbasis aturan dan berbasis biaya yang mencakup (tetapi tidak terbatas pada) predikat push down dan
pemangkasan kolom. Ditargetkan untuk rilis Apache Spark 2.2, item jira [SPARK-16026] Kerangka Kerja
Pengoptimal Berbasis Biaya di https://issues.apache.org/jira/browse/SPARK-16026 adalah tiket payung
untuk mengimplementasikan kerangka kerja pengoptimal berbasis biaya di luar pemilihan gabungan
siaran. Untuk informasi lebih lanjut, silakan merujuk ke Spesifikasi Desain Pengoptimalan Berbasis Biaya
Spark di http://bit.ly/2li1t4T .
Sebagai bagian dari Project Tungsten, ada peningkatan lebih lanjut pada kinerja dengan menghasilkan
kode byte (pembuatan kode atau codegen) alih-alih menafsirkan setiap baris data. Temukan detail lebih
lanjut tentang Tungsten di bagian Proyek Tungsten di Bab 1, Memahami Spark.
Seperti yang disebutkan sebelumnya, pengoptimal didasarkan pada konstruksi pemrograman fungsional
dan dirancang dengan dua tujuan: untuk memudahkan penambahan teknik dan fitur pengoptimalan baru
ke Spark SQL, dan untuk memungkinkan pengembang eksternal memperluas pengoptimal (misalnya,
menambahkan aturan khusus sumber data, dukungan untuk tipe data baru, dan sebagainya).
Note
Untuk informasi lebih lanjut, silakan merujuk ke presentasi Michael Armbrust yang luar biasa, Structuring
Spark: SQL DataFrames, Datasets, and Streaming di http://bit.ly/2cJ508x .
Untuk pemahaman lebih lanjut tentang Catalyst Optimizer, silakan merujuk ke Deep Dive into Spark
SQL's Catalyst Optimizer di http://bit.ly/2bDVB1T .
Juga, untuk informasi lebih lanjut tentang Project Tungsten, silakan merujuk ke Project Tungsten:
Membawa Apache Spark Lebih Dekat ke Bare Metal di http://bit.ly/2bQIlKY , dan Apache Spark sebagai
Compiler: Bergabung dengan Miliar Baris per Detik di Laptop di http://bit.ly/2bDWtnc .
Mempercepat PySpark dengan DataFrame
Pentingnya DataFrames dan Catalyst Optimizer (dan Project Tungsten) adalah peningkatan kinerja kueri
PySpark jika dibandingkan dengan kueri RDD yang tidak dioptimalkan. Seperti yang ditunjukkan pada
gambar berikut, sebelum diperkenalkannya DataFrames, kecepatan kueri Python seringkali dua kali lebih
lambat daripada kueri Scala yang sama menggunakan RDD. Biasanya, perlambatan performa kueri ini
disebabkan oleh overhead komunikasi antara Python dan JVM:
setelah kita membuat RDD, kita akan mengubahnya menjadi DataFrame dengan menggunakan metode
SparkSession read.json (yaitu, spark.read.json(...)). Kita juga akan membuat tabel sementara dengan
menggunakan metode .createOrReplaceTempView.
Note
Di Spark 1.x, metode ini adalah.registerTempTable, yang tidak digunakan lagi sebagai bagian dari Spark
2.x.
Membuat DataFrame
swimmersJSON = spark.read.json(stringJSONRDD)
swimmersJSON.createOrReplaceTempView("swimmersJSON")
Seperti disebutkan dalam bab sebelumnya, banyak operasi RDD adalah transformasi, yang tidak
dieksekusi sampai operasi tindakan dieksekusi. Misalnya, dalam cuplikan kode sebelumnya, sc.parallelize
adalah transformasi yang dijalankan saat mengonversi dari RDD ke DataFrame dengan menggunakan
spark.read.json. Perhatikan bahwa, dalam cuplikan layar buku catatan cuplikan kode ini (di dekat kiri
bawah), pekerjaan Spark tidak dijalankan hingga sel kedua yang berisi operasi spark.read.json.
Tip
Ini adalah cuplikan layar dari Databricks Community Edition, tetapi semua sampel kode dan cuplikan
layar UI Spark dapat dieksekusi/dilihat dalam raga apa pun dari Apache Spark 2.x.
Untuk lebih menekankan poin tersebut, di panel kanan gambar berikut, kami menyajikan grafik eksekusi
DAG.
Note
Sumber daya yang bagus untuk lebih memahami visualisasi DAG UI Spark adalah posting blog
Memahami Aplikasi Apache Spark Anda Melalui Visualisasi di http://bit.ly/2cSemkv .
Dalam cuplikan layar berikut, Anda dapat melihat operasi sparallelize pekerjaan Spark berasal dari sel
pertama yang menghasilkan string RDDJSONRDD, sedangkan operasi map dan mapPartitions adalah
operasi yang diperlukan untuk membuat DataFrame:
Dalam cuplikan layar berikut, Anda dapat melihat tahapan untuk operasi paralelisasi berasal dari sel
pertama yang menghasilkan string RDDJSONRDD, sedangkan operasi map dan mapPartitions adalah
operasi yang diperlukan untuk membuat DataFrame:
Spark UI
dari visualisasi DAG dari tahapan dalam
spark.read.json(stringJSONRDD) pekerjaan.
Penting untuk dicatat bahwa parallelize, map, dan mapPartitions semuanya adalah transformasi RDD.
Dibungkus dalam operasi DataFrame, spark.read.json (dalam hal ini), tidak hanya transformasi RDD,
tetapi juga tindakan yang mengubah RDD menjadi DataFrame. Ini adalah panggilan penting, karena
meskipun Anda menjalankan operasi DataFrame, untuk men-debug operasi Anda, Anda perlu ingat bahwa
Anda akan memahami operasi RDD dalam UI Spark.
Perhatikan bahwa membuat tabel sementara adalah transformasi DataFrame dan tidak dijalankan hingga
tindakan DataFrame dijalankan (misalnya, dalam kueri SQL yang akan dijalankan di bagian berikut).
Note
Transformasi dan tindakan DataFrame mirip dengan transformasi dan tindakan RDD karena ada
serangkaian operasi yang malas (transformasi). Tapi, dibandingkan dengan RDD, operasi DataFrames
tidak malas, terutama karena Catalyst Optimizer. Untuk informasi lebih lanjut, silakan merujuk ke buku
Holden Karau dan Rachel Warren High Performance Spark, http://highperformancespark.com/ .
Sekarang setelah Anda membuat swimmersJSON DataFrame, kita akan dapat menjalankan DataFrame
API, serta kueri SQL terhadapnya. Mari kita mulai dengan kueri sederhana yang menunjukkan semua
baris dalam DataFrame.
Untuk melakukan ini menggunakan DataFrame API, Anda dapat menggunakan metode show(), yang
mencetak n baris pertama ke konsol:
Tip
Kueri SQL
Jika Anda lebih suka menulis pernyataan SQL, Anda dapat menulis kueri berikut:
Kami menggunakan metode .collect(), yang mengembalikan semua catatan sebagai daftar objek Row.
Perhatikan bahwa Anda dapat menggunakan metode collect() atau show() untuk kueri DataFrame dan
SQL. Pastikan bahwa jika Anda menggunakan .collect(), ini untuk DataFrame kecil, karena akan
mengembalikan semua baris di DataFrame dan memindahkannya kembali dari eksekutor ke driver.
Sebagai gantinya, Anda dapat menggunakan take(<n>) atau show(<n>), yang memungkinkan Anda
membatasi jumlah baris yang dikembalikan dengan menentukan <n> :
Tip
Perhatikan bahwa, jika Anda menggunakan Databricks, Anda dapat menggunakan perintah %sql dan
menjalankan pernyataan SQL Anda langsung di dalam sel notebook, seperti yang disebutkan.
Ada dua metode berbeda untuk mengonversi RDD yang ada menjadi DataFrame (atau Datasets[T]):
menyimpulkan skema menggunakan refleksi, atau menentukan skema secara terprogram. Yang pertama
memungkinkan Anda untuk menulis kode yang lebih ringkas (ketika aplikasi Spark Anda sudah
mengetahui skema), sedangkan yang terakhir memungkinkan Anda membuat DataFrame ketika kolom
dan jenis datanya hanya terungkap pada waktu proses. Catatan, refleksi mengacu pada refleksi skema
sebagai lawan dari refleksi Python.
Dalam proses membangun DataFrame dan menjalankan kueri, kami melewatkan fakta bahwa skema
untuk DataFrame ini ditentukan secara otomatis. Awalnya, objek baris dibangun dengan meneruskan
daftar pasangan kunci/nilai sebagai **kwargs ke kelas baris. Kemudian, Spark SQL mengonversi RDD
objek baris ini menjadi DataFrame, di mana kuncinya adalah kolom dan jenis data disimpulkan dengan
mengambil sampel data.
Tip
Konstruksi **kwargs memungkinkan Anda untuk meneruskan sejumlah parameter variabel ke metode
saat runtime.
Kembali ke kode, setelah awalnya membuat swimmersJSON DataFrame, tanpa menentukan skema, Anda
akan melihat definisi skema dengan menggunakan metode printSchema():
# Cetak skema
swimmersJSON.printSchema()
Tetapi bagaimana jika kita ingin menentukan skema karena, dalam contoh ini, kita tahu bahwa id
sebenarnya adalah long alih-alih string?
Dalam hal ini, mari kita tentukan skema secara terprogram dengan memasukkan tipe data Spark SQL
(pyspark.sql.types) dan menghasilkan beberapa data .csv untuk contoh ini:
# Import types
from pyspark.sql.types import *
Pertama, kita akan mengkodekan skema sebagai string, sesuai variabel [skema] di bawah ini. Kemudian
kita akan mendefinisikan skema menggunakan StructType dan StructField:
# Specify schema
schema = StructType([
StructField("id", LongType(), True),
StructField("name", StringType(), True),
StructField("age", LongType(), True),
StructField("eyeColor", StringType(), True)
])
Terakhir, kita akan menerapkan skema (skema) yang kita buat ke stringCSVRDD RDD (yaitu, data
generated.csv) dan membuat tampilan sementara sehingga kita dapat menanyakannya menggunakan SQL:
# Apply the schema to the RDD and Create DataFrame
swimmers = spark.createDataFrame(stringCSVRDD, schema)
Dengan contoh ini, kita memiliki kontrol yang lebih halus atas skema dan dapat menentukan bahwa id
adalah long (berlawanan dengan string di bagian sebelumnya):
swimmers.printSchema()
Dalam banyak kasus, skema dapat disimpulkan (sesuai bagian sebelumnya) dan Anda tidak perlu
menentukan skema, seperti pada contoh sebelumnya ini.
Seperti yang disebutkan di bagian sebelumnya, Anda dapat memulai dengan menggunakan collect(),
show(), atau take() untuk melihat data dalam DataFrame Anda (dengan dua yang terakhir termasuk opsi
untuk membatasi jumlah baris yang dikembalikan).
Jumlah baris
Untuk mendapatkan jumlah baris dalam DataFrame, Anda dapat menggunakan metode count():
swimmers.count()
Keluar[13]: 3
Untuk menjalankan pernyataan filter, Anda dapat menggunakan klausa filter; Dalam cuplikan kode
berikut, kita menggunakan klausa select untuk menentukan kolom yang akan dikembalikan juga:
# Get the id, age where age = 22
swimmers.select("id", "age").filter("age = 22").show()
Output dari kueri ini adalah memilih hanya kolom id dan usia, di mana usia = 22:
Jika kita hanya ingin mendapatkan kembali nama swimmers yang memiliki warna mata yang diawali
dengan huruf b, kita dapat menggunakan sintaks seperti SQL, seperti, seperti yang ditunjukkan pada kode
berikut:
# Get the name, eyeColor where eyeColor like 'b%' swimmers.select("name", "eyeColor").filter("eyeColor
like 'b%'").show()
Mari kita jalankan kueri yang sama, kecuali kali ini, kita akan melakukannya menggunakan kueri SQL
terhadap DataFrame yang sama. Ingatlah bahwa DataFrame ini dapat diakses karena kami menjalankan
metode .createOrReplaceTempView untuk swimmers.
Jumlah baris
Berikut ini adalah cuplikan kode untuk mendapatkan jumlah baris dalam DataFrame Anda menggunakan
SQL:
Klausul Untuk menjalankan pernyataan filter menggunakan SQL, Anda dapat menggunakan klausa
where, seperti yang disebutkan dalam cuplikan kode berikut:
Output dari kueri ini adalah memilih hanya kolom id dan usia di mana usia = 22:
Seperti halnya kueri DataFrame API, jika kita ingin mendapatkan kembali nama swimmers yang memiliki
warna mata yang dimulai dengan huruf b saja, kita juga dapat menggunakan sintaks serupa:
spark.sql( "pilih nama, eyeColor dari swimmers di mana eyeColor seperti 'b%'").show()
Untuk informasi selengkapnya, silakan lihat Panduan Spark SQL, DataFrames, dan Himpunan Data di
http://bit.ly/2cd1wyx
Note
Catatan penting saat bekerja dengan Spark SQL dan DataFrames adalah https://www.iteblog.com bahwa
meskipun mudah untuk bekerja dengan CSV, JSON, dan berbagai format data, format penyimpanan yang
paling umum untuk kueri analitik Spark SQL adalah format file Parquet. Ini adalah format kolom yang
didukung oleh banyak sistem pemrosesan data lainnya dan Spark SQL mendukung pembacaan dan
penulisan file Parquet yang secara otomatis mempertahankan skema data asli. Untuk informasi lebih
lanjut, silakan merujuk ke Panduan Pemrograman Spark SQL terbaru > Parquet Files di:
http://spark.apache.org/docs/latest/sql-programming guide.html#parquet-files . Selain itu, ada banyak
pengoptimalan performa yang berkaitan dengan Parquet, termasuk (namun tidak terbatas pada) Penemuan
Partisi Otomatis dan Migrasi Skema untuk Parquet di https://databricks.com/blog/2015/03/24/spark-sql-
graduates-from-alpha in-spark-1-3.html dan Bagaimana Apache Spark melakukan penghitungan cepat
menggunakan metadata parket di https://github.com/dennyglee/databricks/blob/master/misc/parquet
count-metadata-explanation.md
performa Untuk menampilkan jenis kueri yang dapat Anda lakukan dengan DataFrames, mari kita lihat
kasus penggunaan performa penerbangan tepat waktu. Kami akan menganalisis Kinerja Maskapai
Penerbangan Tepat Waktu dan Penyebab Keterlambatan Penerbangan: Data Tepat Waktu
(http://bit.ly/2ccJPPM), dan menggabungkannya dengan kumpulan data bandara, yang diperoleh dari
Bandara Penerbangan Terbuka, maskapai penerbangan, dan data rute (http://bit.ly/2ccK5hw), untuk lebih
memahami variabel yang terkait dengan penundaan penerbangan.
Tip
Untuk bagian ini, kami akan menggunakan Databricks Community Edition (penawaran gratis produk
Databricks), yang bisa Anda dapatkan di https://databricks.com/try-databricks . Kami akan menggunakan
visualisasi dan himpunan data yang dimuat sebelumnya dalam Databricks untuk memudahkan Anda fokus
menulis kode dan menganalisis hasilnya.
Jika Anda lebih suka menjalankannya di lingkungan Anda sendiri, Anda dapat menemukan kumpulan data
yang tersedia di repositori GitHub kami untuk buku ini di
https://github.com/drabastomek/learningPySpark
Pertama-tama kita akan memproses bandara sumber dan himpunan data kinerja penerbangan dengan
menentukan lokasi jalur filenya dan mengimpornya menggunakan SparkSession:
Perhatikan bahwa kami mengimpor data menggunakan pembaca CSV (com.databricks.spark.csv), yang
berfungsi untuk pemibus yang ditentukan (perhatikan bahwa data bandara dibatasi tab, sedangkan data
performa penerbangan dibatasi koma). Terakhir, kami menyimpan himpunan data penerbangan sehingga
kueri berikutnya akan lebih cepat.
Salah satu tugas yang lebih umum dengan DataFrames/SQL adalah menggabungkan dua himpunan data
yang berbeda; Ini sering kali merupakan salah satu operasi yang lebih menuntut (dari perspektif kinerja).
Dengan DataFrames, banyak pengoptimalan performa untuk gabungan ini disertakan secara default:
Dengan menggunakan notebook (seperti Databricks, iPython, Jupyter, dan Apache Zeppelin), Anda dapat
lebih mudah menjalankan dan memvisualisasikan kueri Anda. Dalam contoh berikut, kita akan
menggunakan buku catatan Databricks. Dalam notebook Python kita, kita dapat menggunakan fungsi
%sql untuk mengeksekusi pernyataan SQL dalam sel notebook tersebut:
%sql
-- Query Sum of Flight Delays by City and Origin Code (for Washington State)
select a.City, f.origin, sum(f.delay) as Delays
from FlightPerformance f
join airports a
on a.IATA = f.origin
where a.State = 'WA'
group by a.City, f.origin
order by sum(f.delay) desc
Ini sama dengan kueri sebelumnya, tetapi karena pemformatan, lebih mudah dibaca. Dalam contoh buku
catatan Databricks kami, kami dapat dengan cepat memvisualisasikan data ini ke dalam bagan batang:
Memvisualisasikan data kinerja penerbangan kami
Mari kita lanjutkan memvisualisasikan data kita, tetapi dipecah berdasarkan semua negara bagian di benua
AS:
%sql
—Query Sum of Flight Delays by State (for the US)
select a.State, sum(f.delay) as Delays
from FlightPerformance f
join airports a
on a.IATA = f.origin
where a.Country = 'USA'
group by a.State
Tapi, akan lebih keren untuk melihat data ini sebagai peta; Klik ikon bagan batang di kiri bawah bagan,
dan Anda dapat memilih dari banyak navigasi asli yang berbeda, termasuk peta:
Salah satu manfaat utama DataFrame adalah bahwa informasi disusun mirip dengan tabel. Oleh karena itu,
apakah Anda menggunakan notebook atau alat BI favorit Anda, Anda akan dapat dengan cepat
memvisualisasikan data Anda.
Tip
Setelah diskusi tentang Spark DataFrame ini, mari kita rekap singkat tentang Spark Dataset API.
Diperkenalkan di Apache Spark 1.6, tujuan Kumpulan Data Spark adalah untuk menyediakan API yang
memungkinkan pengguna mengekspresikan transformasi pada objek domain dengan mudah, sekaligus
memberikan kinerja dan manfaat mesin eksekusi Spark SQL yang kuat. Sebagai bagian dari rilis Spark 2.0
(dan seperti yang disebutkan dalam diagram di bawah), API DataFrame digabungkan ke dalam API
Himpunan Data sehingga menyatukan kemampuan pemrosesan data di semua pustaka. Karena penyatuan
ini, pengembang sekarang memiliki lebih sedikit konsep untuk dipelajari atau diingat, dan bekerja dengan
satu API tingkat tinggi dan aman jenis – yang disebut Dataset:
Secara konseptual, Spark DataFrame adalah alias untuk kumpulan objek generik Dataset[Row], di mana
Baris adalah objek JVM generik yang tidak diketik. Dataset, sebaliknya, adalah kumpulan objek JVM
yang diketik dengan kuat, ditentukan oleh kelas kasus yang Anda tentukan, di Scala atau Java. Poin
terakhir ini sangat penting karena ini berarti bahwa API Himpunan Data tidak didukung oleh PySpark
karena kurangnya manfaat dari peningkatan jenis. Catatan, untuk bagian API Himpunan Data yang tidak
tersedia di PySpark, mereka dapat diakses dengan mengonversi ke RDD atau dengan menggunakan UDF.
Untuk informasi lebih lanjut, silakan merujuk ke jira [SPARK 13233]: Kumpulan Data Python di
http://bit.ly/2dbfoFT .
Ringkasan
Dengan Spark DataFrames, pengembang Python dapat menggunakan lapisan abstraksi yang lebih
sederhana yang juga berpotensi lebih cepat secara signifikan. Salah satu alasan utama Python awalnya
lebih lambat dalam Spark adalah karena lapisan komunikasi antara sub-proses Python dan JVM. Untuk
pengguna Python DataFrame, kami memiliki pembungkus Python di sekitar Scala DataFrames yang
menghindari overhead komunikasi sub-proses Python/JVM. Spark DataFrames memiliki banyak
peningkatan kinerja melalui Catalyst Optimizer dan Project Tungsten yang telah kami ulas di bab ini.
Dalam bab ini, kami juga meninjau cara bekerja dengan Spark DataFrames dan mengerjakan skenario
performa penerbangan tepat waktu menggunakan DataFrames.
Dalam bab ini, kami membuat dan bekerja dengan DataFrame dengan menghasilkan data atau
memanfaatkan kumpulan data yang ada.
Pada bab selanjutnya, kita akan membahas cara mengubah dan memahami data Anda sendiri.