Dataframe di Apache PySpark: Tutorial Komprehensif [dengan Contoh]

Diterbitkan: 2020-02-27

Hari ini, kita akan belajar tentang DataFrame di Apache PySpark . Pyspark adalah salah satu alat ilmu data teratas pada tahun 2020. Ini dinamai kolom dari kumpulan baris terdistribusi di Apache Spark. Ini sangat mirip dengan Tabel atau kolom di Excel Sheets dan juga mirip dengan tabel database relasional. PySpark DataFrame juga memiliki karakteristik yang mirip dengan RDD, yaitu:

Terdistribusi: Sifat DataFrame dan RDD keduanya terdistribusi

Evaluasi Malas: Pelaksanaan tugas tidak dilakukan jika tindakan tidak dilakukan

Sifat Kekekalan: Karakteristik lain yang serupa dari RDD / DataFrame adalah tidak dapat diubah setelah dibuat. Tetapi seseorang dapat menerapkan transformasi untuk mengubah RDD/DataFrame.

Daftar isi

Keuntungan dari DataFrames

1. Ini mendukung banyak berbagai bahasa, seperti Java, Scala, R, Python, yang berguna dalam hal Dukungan API. Dukungan API untuk berbagai bahasa membantu dalam bekerja dengan banyak bahasa pemrograman.

2. Berbagai sumber dan format data didukung oleh DataFrame, yang sangat membantu untuk menggunakan sumber data yang berbeda dan formatnya dengan nyaman.

3. Salah satu bagian terbaik tentang DataFrame adalah ia bahkan dapat menangani data Petabytes, yang merupakan kemampuan luar biasa untuk menangani data sebesar itu.

4. Apache Spark dengan cepat memahami skema DataFrame dengan pengamatan di Spark DataFrame. Di bawah kolom bernama, Pengamatan Spark DataFrame diatur. Dengan cara ini, rencana eksekusi kueri dioptimalkan.

5. Volume Massive Data Semi-terstruktur dan Terstruktur dapat dengan cepat diproses karena dirancang untuk melakukannya DataFrames.

Pengaturan Apache Spark

Apache Spark harus disiapkan di mesin sebelum dapat mulai digunakan untuk Operasi DataFrame. Data dapat dioperasikan dengan dukungan DataFrame karena mendukung berbagai Operasi DataFrame. Di sini kita akan membahas beberapa operasi DataFrame yang umum.

Pembuatan SparkContext adalah langkah pertama dalam pemrograman Apache. Untuk pelaksanaan operasi dalam sebuah cluster, ada persyaratan SparkContext. Cara mengakses cluster diceritakan oleh SparkContext. Ini juga menunjukkan Spark tentang lokasi untuk mendapatkan cluster.

Baca: Kerangka Pembelajaran Mendalam

Kemudian koneksi Apache Cluster dibuat. Pembuatannya sudah dilakukan jika seseorang menggunakan Spark Shell. Cara lain, pengaturan konfigurasi, dapat disediakan, diinisialisasi, dan diimpor untuk pembuatan SparkContext.

Seseorang dapat menggunakan kode ini untuk pembuatan:

dari pyspark impor SparkContext

sc = SparkContext()

Pembuatan DataFrame dari file CSV

Pustaka baru harus ditentukan dalam shell python sehingga file CSV dapat dibaca. Untuk melakukan ini, langkah pertama adalah mengunduh paket Spark-CSV versi terbaru dan melakukan ekstraksi paket di Direktori Beranda Spark. Setelah itu, kita akan membuka shell PySpark, dan paket harus disertakan.

$ ./bin/pyspark –paket com.databricks:spark-csv_2.10:1.3.0

Sekarang DataFrame akan dibuat setelah data dibaca dari file CSV.

train = sqlContext.load(source=”com.databricks.spark.csv”, path = 'PATH/train.csv', header = True,inferSchema = True)

test = sqlContext.load(source=”com.databricks.spark.csv”, path = 'PATH/test-comb.csv', header = True,inferSchema = True)

File CSV uji dan file CSV latih terletak di lokasi folder yang disebut PATH. Jika Header ada di file CSV, maka itu akan ditampilkan sebagai True. Untuk mengetahui tipe data pada setiap kolom frame data, kita akan menggunakan opsi inferSchema = True. Dengan menggunakan opsi inferSchema = True, Deteksi tipe data frame data setiap kolom akan dideteksi secara otomatis oleh konteks SQL. Semua kolom akan dibaca sebagai string Jika kita tidak menyetel inferSchema menjadi true.

Baca: Pustaka Python untuk Pembelajaran Mesin

Manipulasi DataFrame

Sekarang di sini kita akan melihat bagaimana memanipulasi Data Frame:

  • Ketahui Jenis Data Kolom

printSchema akan digunakan untuk melihat tipe kolom dan tipe datanya. Sekarang skema akan dicetak dalam format pohon dengan menerapkan printSchema().

kereta.printSchema()

Keluaran:

akar

|– User_ID: integer (nullable = true)

|– Product_ID: string (nullable = true)

|– Jenis Kelamin: string (nullable = true)

|– Usia: string (nullable = true)

|– Pekerjaan: integer (nullable = true)

|– City_Category: string (nullable = true)

|– Stay_In_Current_City_Years: string (nullable = true)

|– Status_Perkawinan: integer (nullable = true)

|– Product_Category_1: integer (nullable = true)

|– Product_Category_2: integer (nullable = true)

|– Product_Category_3: integer (nullable = true)

|– Pembelian: integer (nullable = true)

Setelah membaca file csv, kita dapat melihat bahwa kita secara akurat mendapatkan jenis data atau skema setiap kolom dalam bingkai data.

  • Menampilkan n pengamatan pertama

Untuk melihat n pengamatan pertama, dapat menggunakan operasi kepala. Operasi kepala Panda sama seperti operasi kepala PySpark.

kereta.kepala(5)

Keluaran:

[Baris(User_ID=1000001, Product_ID=u'P00069042′, Gender=u'F', Age=u'0-17′, Occupation=10, City_Category=u'A', Stay_In_Current_City_Years=u'2′, Marital_Status= 0, Product_Category_1=3, Product_Category_2=Tidak Ada, Product_Category_3=Tidak Ada, Pembelian=8370),

Baris(ID_Pengguna=1000001, ID_Produk=u'P00248942′, Jenis Kelamin=u'F', Usia=u'0-17′, Pekerjaan=10, City_Category=u'A', Stay_In_Current_City_Years=u'2′, Marital_Status=0 , Product_Category_1=1, Product_Category_2=6, Product_Category_3=14, Pembelian=15200),

Baris(User_ID=1000001, Product_ID=u'P00087842′, Gender=u'F', Age=u'0-17′, Occupation=10, City_Category=u'A', Stay_In_Current_City_Years=u'2′, Marital_Status=0 , Product_Category_1=12, Product_Category_2=Tidak Ada, Product_Category_3=Tidak Ada, Pembelian=1422),

Baris(User_ID=1000001, Product_ID=u'P00085442′, Gender=u'F', Age=u'0-17′, Occupation=10, City_Category=u'A', Stay_In_Current_City_Years=u'2′, Marital_Status=0 , Product_Category_1=12, Product_Category_2=14, Product_Category_3=Tidak Ada, Pembelian=1057),

Baris(User_ID=1000002, Product_ID=u'P00285442′, Gender=u'M', Age=u'55+', Occupation=16, City_Category=u'C', Stay_In_Current_City_Years=u'4+', Marital_Status=0 , Product_Category_1=8, Product_Category_2=Tidak Ada, Product_Category_3=Tidak Ada, Pembelian=7969)]

Sekarang kita akan menggunakan operasi show untuk melihat hasilnya dengan cara yang lebih baik karena hasilnya akan datang dalam format baris. Kita juga dapat memotong hasilnya dengan menggunakan argumen truncate = True.

train.show(2,truncate= Benar)

Keluaran:

+——-+———-+——+—-+———-+————-+————————–+————–+——————+ ——————+——————+——–+

|User_ID|Product_ID|Gender| Umur|Pekerjaan|City_Category|Stay_In_Current_City_Years|Marital_Status|Product_Category_1|Product_Category_2|Product_Category_3|Pembelian|

+——-+———-+——+—-+———-+————-+————————–+————–+——————+ ——————+——————+——–+

|1000001| P00069042| F|0-17| 10| A| 2| 0| 3| nol| nol| 8370|

|1000001| P00248942| F|0-17| 10| A| 2| 0| 1| 6| 14| 15200|

+——-+———-+——+—-+———-+————-+————————–+————–+——————+ ——————+——————+——–+

hanya menampilkan 2 baris teratas

  • Menghitung nomor baris DataFrame

Untuk menghitung jumlah baris dalam bingkai data, kita dapat menggunakan operasi hitung. Sekarang kita akan menghitung jumlah baris file pengujian dan melatih file dengan menerapkan operasi hitungan.

kereta.hitung(),tes.hitung()

Keluaran:

(233598, 550069)

Kami memiliki 233598, 550069, baris dalam pengujian & kereta, masing-masing.

  • Mendapatkan jumlah kolom dan nama kolom dari file uji dan latih

Mirip dengan operasi kolom di DataFrame panda, kita akan menggunakan operasi kolom untuk mendapatkan nama kolom. Sekarang pertama kita akan mencetak no. kolom dan nama kolom dari file uji dan file kereta.

len(kereta.kolom), kereta.kolom

Keluaran:

12 ['User_ID', 'Product_ID', 'Gender', 'Usia', 'Occupation', 'City_Category', 'Stay_In_Current_City_Years', 'Marital_Status', 'Product_Category_1', 'Product_Category'

Sekarang kita melakukannya untuk file tes dengan cara yang sama.

len(test.columns), test.columns

Keluaran:

13 [”, 'User_ID', 'Product_ID', 'Gender', 'Usia', 'Occupation', 'City_Category', 'Stay_In_Current_City_Years', 'Marital_Status', 'Product_Category_1', 'Product_Category_1', 'Product_Category_1' ']

Setelah output di atas, kita dapat melihat bahwa ada 12 kolom di file pelatihan dan 13 kolom di file tes. Dari output di atas, kita dapat memeriksa bahwa kita memiliki 13 kolom di file tes dan 12 di file pelatihan. Kolom "Sisir" adalah satu-satunya kolom dalam file pengujian, dan tidak ada "Pembelian" yang tidak ada dalam file pengujian. Ada satu kolom lagi di file tes yang bisa kita lihat tidak memiliki nama kolom.

  • Mendapatkan statistik ringkasan seperti count, max, min, standar deviance, mean dalam kolom numerik DataFrame

Dalam DataFrame, kita akan menggunakan operasi yang disebut operasi deskripsi. Kita dapat melakukan perhitungan kolom numerik dan mendapatkan ringkasan statistik dengan menggunakan operasi uraikan. Semua kolom numerik akan dihitung dalam DataFrame, kami tidak ada nama kolom yang ditentukan dalam perhitungan statistik ringkasan.

kereta.deskripsikan().tampilkan()

Keluaran:

+——-+——————+—————–+——————-+——————+——————+——————+———————+——————+—— ————+

|ringkasan| ID_pengguna| Pekerjaan| Status_Perkawinan|Kategori_Produk_1|Kategori_Produk_2|Kategori_Produk_3| Beli|

+——-+——————+—————–+——————-+——————+——————+——————+———————+——————+—— ————+

| hitung| 550068| 550068| 550068| 550068| 376430| 166821| 550068|

| mean|1003028.8424013031|8.076706879876669|0.40965298835780306| 5.404270017525106| 9.84232925122386|12.668243206790512| 9263.968712959126|

| stddev|1727.591585308265|6.522660487341778| 0,4917701263173273|3.9362113692014082| 5.086589648693526| 4.125337631575267|5023.06539383206015|

| menit| 1000001| 0| 0| 1| 2| 3| 12|

| maks| 1006040| 20| 1| 20| 18| 18| 23961|

+——-+——————+—————–+——————-+——————+——————+——————+———————+——————+—— ————+

Dalam operasi deskripsi, inilah yang kita dapatkan ketika nama kolom string atau nama kolom kategoris ditentukan.

train.describe('Product_ID').show()

Keluaran:

+——-+———-+

|ringkasan|ID_Produk|

+——-+———-+

| hitung| 550068|

| berarti| nol|

| stddev| nol|

| menit| P00000142|

| maks| P0099942|

+——-+———-+

Berdasarkan ASCII, nilai max dan min dihitung. Operasi Mendeskripsikan digunakan untuk bekerja pada kolom tipe String.

  • Pemilihan kolom DataFrame

Kami akan menggunakan nama kolom dalam operasi pilih untuk memilih kolom. Kami akan menyebutkan nama kolom dengan pemisahan dengan menggunakan koma. Sekarang kita akan melihat bagaimana pemilihan “Age” dan “User_ID” dari file pelatihan dibuat.

  • train.select('User_ID','Usia').show(5)
  • Keluaran:
  • +——-+—-+
  • |User_ID| Usia|
  • +——-+—-+
  • |1000001|0-17|
  • |1000001|0-17|
  • |1000001|0-17|
  • |1000001|0-17|
  • |1000002| 55+|
  • +——-+—-+
  • Menemukan produk yang Berbeda no. dalam file uji dan file kereta

Untuk menghitung dataFrame no. baris yang berbeda, kami akan menggunakan operasi yang berbeda . Sekarang di sini kita akan menerapkan operasi yang berbeda untuk perhitungan no. produk yang berbeda dalam file uji dan kereta.

train.select('Product_ID').distinct().count(),test.select('Product_ID').distinct().count()

Keluaran:

(3633, 3492)

Kami memiliki 3492 & 3633 produk berbeda dalam file uji & kereta, masing-masing. Sekarang kita tahu bahwa dalam file pelatihan, kita memiliki nilai yang lebih berbeda daripada file pengujian karena kita dapat belajar dari hasil output. Sekarang kita akan menggunakan operasi pengurangan untuk mengetahui kategori Product_ID yang tidak ada di file pelatihan tetapi ada di file tes. Hal yang sama juga dapat dilakukan untuk semua fitur kategoris.

diff_cat_in_train_test=test.select('Product_ID').subtract(train.select('Product_ID'))

diff_cat_in_train_test.distinct().count()# Untuk hitungan yang berbeda

Keluaran:

46

Jadi dari hasil di atas, kita dapat mengetahui bahwa ada 47 kategori yang berbeda, yang tidak ada di file pelatihan tetapi ada di file tes. Data akan dilewati atau dikumpulkan dari file tes, yang tidak ada dalam file kereta.

  • Perhitungan frekuensi berpasangan kolom kategoris?

Mari kita lakukan perhitungan frekuensi berpasangan kolom di DataFrame dengan menggunakan operasi dapat operasi tab silang. Sekarang mari kita hitung kolom “Jenis Kelamin” dan “Usia” di DataFrame kereta dengan menerapkan operasi tab silang .

train.crosstab('Usia', 'Jenis Kelamin').show()

Keluaran:

+———-+—–+——+

|Usia_Jenis Kelamin| F| M|

+———-+—–+——+

| 0-17| 5083| 10019|

| 46-50|13199| 32502|

| 18-25|24628| 75032|

| 36-45|27170| 82843|

| 55+| 5083| 16421|

| 51-55| 9894| 28607|

| 26-35|50752|168835|

+———-+—–+——+

Nilai yang berbeda dari Gender adalah nama kolom, dan nilai yang berbeda dari Age adalah nama baris, yang dapat dilihat pada hasil di atas. Dalam tabel, hitungan pasangan akan menjadi nol jika belum terjadi.

Bagaimana cara mendapatkan DataFrame dengan baris Unik?

Untuk menemukan baris unik dan tidak menyertakan baris duplikat, kita akan menggunakan operasi dropDuplicates . Itu akan mendapatkan Dataframe tanpa baris duplikat dengan menjatuhkan baris duplikat dari DataFrame. Silakan periksa di sini untuk mengetahui bagaimana prosedur dropDuplicates dilakukan untuk mendapatkan semua baris unik untuk kolom.

train.select('Usia','Gender').dropDuplicates().show()

Keluaran:

+—–+——+

| Usia|Jenis Kelamin|

+—–+——+

|51-55| F|

|51-55| M|

|26-35| F|

|26-35| M|

|36-45| F|

|36-45| M|

|46-50| F|

|46-50| M|

| 55+| F|

| 55+| M|

|18-25| F|

| 0-17| F|

|18-25| M|

| 0-17| M|

+—–+——+

  • Bagaimana cara menjatuhkan baris yang akan bernilai nol?

Jika seseorang ingin menghapus semua baris yang memiliki nilai null, maka kita dapat menggunakan operasi yang disebut operasi dropna . Untuk menjatuhkan baris dari DataFrame, ini mempertimbangkan tiga opsi.

  • Subset – ini adalah daftar semua nama kolom yang dipertimbangkan untuk operasi penurunan kolom dengan nilai nol.
  • Thresh – ini membantu dalam menjatuhkan baris dengan nilai non-null yang kurang dari thresh. Secara default, tidak ada yang ditentukan dalam hal ini.
  • Bagaimana – Dapat digunakan dalam dua jenis – semua atau apa saja. Dengan menggunakan any, itu akan menjatuhkan baris jika ada nilai di baris itu nol. Dengan menggunakan semua, itu akan mengurangi baris jika semua nilai baris adalah nol.

Sekarang di sini kita akan menggunakan semua opsi ini satu per satu untuk menghapus baris yang nol dengan menggunakan opsi default seperti subset, thresh, None for how, none, any.

kereta.dropna().hitung()

Keluaran:

166821

  • Bagaimana cara mengisi nilai null DataFrame dengan konstanta no.?

Untuk mengisi nilai null dengan konstanta no. Kami akan menggunakan operasi fillna di sini. Ada dua parameter yang harus dipertimbangkan oleh operasi fillna untuk mengisi nilai nol.

  • subset: Di sini, seseorang perlu menentukan kolom yang akan dipertimbangkan untuk mengisi nilai.
  • value: Di sini kita bisa menyebutkan jumlah yang akan diganti dengan nilai apa, yang bisa berupa tipe data apa saja seperti string, float, int di semua kolom.

Di sini kita akan mengisi '-1' sebagai ganti nilai null di DataFrame kereta.

train.fillna(-1).show(2)

Keluaran:

+——-+———-+——+—-+———-+————-+————————–+————–+——————+ ——————+——————+——–+

|User_ID|Product_ID|Gender| Umur|Pekerjaan|City_Category|Stay_In_Current_City_Years|Marital_Status|Product_Category_1|Product_Category_2|Product_Category_3|Pembelian|

+——-+———-+——+—-+———-+————-+————————–+————–+——————+ ——————+——————+——–+

|1000001| P00069042| F|0-17| 10| A| 2| 0| 3| -1| -1| 8370|

|1000001| P00248942| F|0-17| 10| A| 2| 0| 1| 6| 14| 15200|

+——-+———-+——+—-+———-+————-+————————–+————–+——————+ ——————+——————+——–+

hanya menampilkan 2 baris teratas

Kesimpulan

PySpark mendapatkan momentum di dunia Artificial Intelligence dan Machine learning. PySpark digunakan untuk memecahkan masalah pembelajaran mesin dunia nyata. Anda dapat membuat RDD dari sumber data yang berbeda baik eksternal maupun yang sudah ada dan melakukan semua jenis transformasi di dalamnya. Semoga artikel ini informatif dan dapat memberi Anda wawasan mendalam tentang kerangka data PySpark.

Jika Anda penasaran untuk belajar tentang PySpark, dan alat ilmu data lainnya, lihat PG Diploma IIIT-B & upGrad dalam Ilmu Data yang dibuat untuk para profesional yang bekerja dan menawarkan 10+ studi kasus & proyek, lokakarya praktis, bimbingan dengan pakar industri, tatap muka dengan mentor industri, 400+ jam pembelajaran dan bantuan pekerjaan dengan perusahaan-perusahaan top.

Apakah PySpark lebih efisien daripada Pandas?

Ya, PySpark lebih cepat dari Panda, dan bahkan mengungguli Panda dalam tes benchmark. Dalam istilah dasar, Pandas melakukan operasi pada satu mesin, sedangkan PySpark menjalankan operasi di beberapa mesin. Jika Anda sedang mengerjakan aplikasi Machine Learning dengan kumpulan data yang besar, PySpark adalah pilihan yang ideal, karena dapat menjalankan operasi 100 kali lebih cepat daripada Pandas. Karena JVM, bahasa pemrograman Scala 10 kali lebih cepat daripada Python untuk analisis dan pemrosesan data. Ketika kode pemrograman Python digunakan untuk membuat panggilan ke perpustakaan Spark, hasilnya biasa-biasa saja.

Apa saja kelemahan menggunakan Apache PySpark?

Spark tidak memiliki sistem manajemen file sendiri. Karena tingginya biaya memori ekstra yang diperlukan untuk mengoperasikan Spark, komputasi dalam memori mungkin sangat mahal. Saat menggunakan Apache Spark dengan Hadoop, pengembang mengalami kesulitan dengan file yang ringkas. Data berulang dalam batch di Spark, dengan setiap iterasi direncanakan dan diproses secara independen. Di Apache Spark, data dibagi menjadi batch yang lebih kecil pada interval waktu yang telah ditentukan. Akibatnya, kriteria jendela berbasis catatan tidak akan didukung oleh Apache. Ini malah memberikan kriteria jendela berbasis waktu.

Bagaimana Dataset, DataFrame, dan RDD berbeda satu sama lain?

RDD adalah kumpulan item data berkerumun yang tersebar di beberapa komputer. Data direpresentasikan melalui RDD, yang merupakan kumpulan objek Java atau Scala. DataFrame adalah kumpulan data yang terstruktur ke dalam kolom bernama yang tersebar di banyak server. Dalam database relasional, secara konseptual setara dengan tabel. Dataset adalah ekstensi API kerangka data yang menawarkan kemampuan antarmuka pemrograman berorientasi objek RDD API yang aman. DataFrame adalah kumpulan data terdistribusi, mirip dengan RDD, dan tidak dapat diubah. Data disusun ke dalam kolom bernama, mirip dengan tabel dalam database relasional, bukan RDD. Dalam hal tugas-tugas sederhana seperti mengelompokkan data, RDD lebih lambat daripada Kerangka Data dan Kumpulan Data. Ini memiliki API sederhana untuk melakukan tugas agregat. Itu dapat mengumpulkan data lebih cepat daripada RDD dan Kumpulan Data.