Lewati ke konten utama

PySpark Baca CSV: Memuat dan Memproses Berkas Besar Secara Efisien

Pelajari cara membaca berkas CSV secara efisien di PySpark. Jelajahi opsi, penanganan skema, kompresi, partisi, dan praktik terbaik untuk sukses di big data.
· 7 mnt Baca

Jelajahi bersama AI

Berkas CSV adalah pilar penting dalam pemrosesan dan analitik data. Hampir setiap profesional data, dari insinyur data tingkat menengah dan data scientist hingga pengembang yang memanfaatkan PySpark, pada akhirnya akan berurusan dengan berkas CSV. Namun, ketika dataset berkembang dari megabyte menjadi gigabyte, bahkan terabyte dan seterusnya, alat tunggal yang sederhana seperti Pandas atau pustaka standar Python akan kesulitan menangani bebannya. Di sinilah Apache Spark dan PySpark menjadi penting untuk mengelola berkas CSV berskala besar dalam lingkungan komputasi terdistribusi.

Artikel ini akan mengajarkan semua yang perlu Anda ketahui saat membaca berkas CSV besar dengan PySpark. 

Pastikan Anda telah memasang PySpark dan memahami dasar-dasarnya dengan mengikuti tutorial Memulai dengan PySpark kami. 

Apa itu Membaca CSV di PySpark?

PySpark memungkinkan pengguna membaca berkas CSV ke dalam DataFrame terdistribusi. DataFrame di PySpark sangat mirip dengan Pandas DataFrame, sehingga antarmukanya terasa familier. Namun di balik layar, PySpark DataFrame mendistribusikan komputasi dan penyimpanan ke beberapa node, memberikan kinerja luar biasa untuk dataset yang sangat besar. 

PySpark menawarkan keunggulan menarik untuk berkas CSV besar, seperti:

  • Pemuatan data terdistribusi,
  • Penanganan nilai null yang tangguh,
  • Fleksibilitas dalam mendefinisikan skema, dan
  • Cara yang mudah untuk mengelola banyak berkas CSV atau yang terkompresi.

Namun demikian, tantangan umum muncul, termasuk menangani header secara efisien, menginferensi atau menetapkan skema secara akurat, serta mengelola rekaman yang rusak atau tidak konsisten. Teruskan membaca untuk mengetahui cara mengatasi semua tantangan ini. 

Membaca berkas CSV di PySpark adalah salah satu topik yang harus Anda pahami untuk unggul dalam wawancara PySpark. 36 Pertanyaan dan Jawaban Wawancara PySpark Teratas untuk 2025 kami menyediakan panduan komprehensif, mencakup topik mulai dari konsep dasar hingga teknik lanjutan dan strategi optimasi.  

Dasar-dasar Membaca Berkas CSV di PySpark

Membaca data CSV sering kali menjadi salah satu langkah awal dan paling krusial dalam alur kerja PySpark, menjadi fondasi untuk transformasi selanjutnya, analisis eksploratori, dan tugas machine learning. Melakukan langkah ini dengan benar memastikan pemrosesan data lebih bersih dan kinerja hilir yang lebih baik.

Kerangka konseptual

PySpark membaca berkas CSV dalam model terdistribusi Spark. Alih-alih membaca data CSV seluruhnya ke dalam memori pada satu mesin, Spark membagi tugas data besar di beberapa node klaster. Optimizer bawaan Spark, Catalyst, semakin meningkatkan kinerja dengan mengeksekusi operasi inti yang diperlukan selama ingest CSV secara efisien.

Sintaks baca inti

Cara sederhana untuk membaca berkas CSV memanfaatkan fungsi bawaan Spark: 

spark.read.csv("file_path", header=True, inferSchema=True)

Atau secara eksplisit:

spark.read.format("csv").option("header", "True").load("file_path")

Parameter kunci meliputi:

  • file_path - lokasi berkas CSV.
  • header - menetapkan nama kolom dari header CSV jika True.
  • inferSchema - secara otomatis menginferensi tipe data kolom.
  • delimiter - karakter pemisah kolom; default adalah koma.

Tutorial Belajar PySpark dari Nol pada 2025 kami membahas lebih detail tentang dasar-dasar PySpark dan cara mempelajarinya. 

Membaca Berkas CSV: Opsi dan Konfigurasi

PySpark menyediakan banyak opsi yang memberi kendali terperinci atas proses pembacaan CSV.

Header dan inferensi skema

Mengatur header=True menginstruksikan Spark untuk menggunakan baris pertama CSV sebagai nama kolom.

inferSchema=True  membuat Spark secara otomatis menebak tipe kolom dengan memindai data Anda:

spark.read.csv("customers.csv", header=True, inferSchema=True)

Walaupun inferensi skema nyaman dan efektif pada awalnya, dataset besar akan mengalami penurunan kinerja karena Spark melakukan banyak kali pemindaian data untuk menentukan tipe data.

Spesifikasi skema kustom 

Mendefinisikan skema secara eksplisit akan meningkatkan kinerja secara signifikan dengan menghilangkan pemindaian data berulang oleh Spark. Skema yang ditentukan mengkomunikasikan nama dan tipe kolom sejak awal.

Berikut cara mendefinisikan skema kustom di PySpark:

from pyspark.sql.types import StructType, StructField, StringType, IntegerType, DoubleType
schema = StructType([
    StructField("user_id", IntegerType(), True),
    StructField("name", StringType(), True),
    StructField("score", DoubleType(), True),
])
df = spark.read.csv("customers.csv", schema=schema, header=True)

Selanjutnya, mari kita bahas penanganan delimiter di PySpark saat membaca berkas CSV. 

Menangani delimiter dan karakter khusus

Banyak berkas CSV menggunakan delimiter selain koma, seperti pipa atau tab. PySpark memungkinkan Anda menentukan delimiter secara eksplisit:

spark.read.csv("customers.csv", header=True, delimiter="|")

Selain itu, karakter escape dan quote juga dapat dikonfigurasi untuk menangani skenario karakter khusus:

spark.read.csv("data.csv", header=True, escape='\"', quote='"')

Mengelola nilai null dan nilai hilang

Data CSV di dunia nyata sering kali berisi inkonsistensi atau rekaman yang tidak lengkap. PySpark memudahkan penanganan nilai null dengan menerjemahkan placeholder kustom menjadi nilai null:

spark.read.csv("customers.csv", header=True, schema=schema, nullValue="NA")

Ini memperjelas nilai null, secara drastis mengurangi pembersihan data manual di kemudian hari.

Mari jelajahi strategi lain untuk menangani nilai null. 

Anda dapat memutuskan untuk memfilter nilai null: 

# Filter baris di mana Age tidak null
df_filtered = df.filter(df["Age"].isNotNull())
df_filtered.show()

Ini memfilter DataFrame agar hanya menyertakan baris di mana kolom Age tidak null. Keluaran akan terlihat seperti:

+---+-----+---+------+
| ID| Name|Age|Salary|
+---+-----+---+------+
|  1| John| 25| 50000|
|  3|  Bob| 30|  NULL|
|  4|Carol| 28| 55000|
+---+-----+---+------+

Strategi lainnya adalah mengisi nilai null: 

# Ganti nilai null di Age dan Salary dengan nilai default
df_filled = df.na.fill({"Age": 0, "Salary": 0})
df_filled.show()

Keluaran akan terlihat seperti ini: 

+---+-----+---+------+
| ID| Name|Age|Salary|
+---+-----+---+------+
|  1| John| 25| 50000|
|  2|Alice|  0| 60000|
|  3|  Bob| 30|     0|
|  4|Carol| 28| 55000|
|  5|David|  0| 48000|
+---+-----+---+------+

Membaca banyak berkas dan direktori

PySpark unggul dalam mengelola dataset besar yang terdiri dari banyak berkas. Alih-alih memuat dan menggabungkan berkas dari direktori secara manual dan berurutan, PySpark mendukung pola wildcard untuk pemuatan massal yang cepat dan efisien:

spark.read.csv("/data/sales/*.csv", header=True, schema=schema)

Ini secara efektif mengagregasikan banyak berkas CSV menjadi satu DataFrame dalam satu operasi yang ringkas.

Setelah data dimuat di PySpark, langkah berikutnya mencakup wrangling, rekayasa fitur, dan membangun model machine learning. Kursus Feature Engineering dengan PySpark kami membahas konsep-konsep ini secara mendalam. 

Teknik Optimasi untuk Pembacaan CSV yang Efisien

Saat menangani data CSV berskala besar, memanfaatkan strategi optimasi PySpark sangatlah krusial.

Strategi partisi

Partisi sangat memengaruhi kinerja dengan mendistribusikan data secara merata di seluruh node klaster. Spark memungkinkan kontrol eksplisit atas ukuran dan jumlah partisi selama ingest data untuk membantu mempercepat operasi selanjutnya:

df = spark.read.csv("data.csv", header=True, schema=schema).repartition(20)

​​.repartition(20) membagi DataFrame menjadi 20 partisi di seluruh klaster Spark Anda. Karena Spark memproses data dalam potongan, memiliki lebih banyak partisi dapat:

  • Meningkatkan paralelisme
  • Menyeimbangkan beban kerja di seluruh klaster
  • Mempercepat transformasi dan penulisan

Jika Anda menjalankan pada klaster dengan banyak core, ini membantu memaksimalkan pemanfaatannya. Namun, Anda dapat memperlambat proses jika berlebihan (misalnya, 1000 partisi pada dataset kecil).

Temukan lebih banyak fungsi Spark seperti repartition melalui PySpark Cheat Sheet: Spark in Python. Lembar contekan ini membahas detail tentang inisialisasi Spark di Python, pemuatan data, penyortiran, dan repartisi. 

Caching dan persistensi

Jika alur kerja Anda berulang kali mengakses dataset yang sama setelah ingest, melakukan caching DataFrame di memori atau di disk dapat meningkatkan kinerja secara signifikan:

df.cache()

Namun, ingat bahwa caching memerlukan sumber daya sistem yang memadai; selalu seimbangkan penggunaan memori dengan manfaat kinerja.

Evaluasi malas dan pemicu aksi

PySpark mengandalkan model evaluasi malas (lazy): operasi dataframe mengubah rencana alih-alih langsung mengeksekusi. Pembacaan berkas yang sebenarnya hanya dijalankan saat diperlukan, dipicu oleh perintah seperti show(), count(), atau collect():

# belum membaca
df = spark.read.csv("data.csv", header=True, schema=schema)   
# pembacaan sebenarnya dipicu di sini
df.show(5)  

Kasus Penggunaan Lanjutan dan Pertimbangan

Mari kita telusuri skenario yang lebih kompleks yang mungkin Anda temui saat membaca berkas CSV: 

Membaca berkas CSV terkompresi

Spark secara efisien mengelola berkas CSV terkompresi seperti gz atau .bz2 secara transparan tanpa konfigurasi tambahan:

spark.read.csv("logs.csv.gz", header=True, schema=schema)

Menangani rekaman yang rusak

Dataset CSV dapat berisi baris yang rusak. PySpark memberikan beberapa opsi untuk membantu Anda mengelola kesalahan atau rekaman yang rusak dengan lancar:

  • mode="PERMISSIVE" (default): menyertakan baris yang rusak dengan kolom yang diisi null.
  • mode="DROPMALFORMED: melewati rekaman yang rusak secara senyap. Mode ini tidak didukung dalam fungsi bawaan CSV.
  • mode="FAILFAST": melempar pengecualian saat menemukan rekaman yang rusak.
spark.read.csv("data.csv", header=True, schema=schema, mode="FAILFAST")

Pengaturan lokal dan enkoding

Terkadang, data CSV menggunakan enkoding non-standar. PySpark dengan mudah menangani berbagai enkoding melalui parameter encoding:

spark.read.csv("data_utf8.csv", header=True, encoding="UTF-8")

Enkoding yang didukung mencakup US-ASCII, ISO-8859-1, UTF-8, UTF-16BE, UTF-16LE, dan UTF-16. 

Praktik terbaik dan jebakan umum

Berikut beberapa praktik terbaik yang perlu diingat saat membaca berkas CSV dengan Spark: 

  • Tentukan skema secara eksplisit jika struktur dataset diketahui.
  • Kendalikan partisi untuk mendistribusikan beban kerja secara efisien.
  • Lakukan cache secara strategis untuk DataFrame yang sering diakses.
  • Picu aksi pembacaan secara sengaja, dengan mengingat evaluasi malas.

Pastikan untuk menghindari: 

  • Mengatur header=False untuk CSV dengan baris header.
  • Hanya mengandalkan inferSchema pada dataset besar atau yang sering diakses.
  • Mengabaikan pengaturan delimiter atau enkoding yang krusial.

Kesimpulan

Memahami dan memanfaatkan kemampuan ingest CSV PySpark yang kuat sangat penting untuk pemrosesan big data yang efektif. Dengan spesifikasi skema yang jelas, penanganan format null kustom, penggunaan partisi yang efisien, dan pengelolaan skenario berkas terkompresi atau multi-berkas, alur kerja Anda menjadi lebih ringkas dan berkinerja tinggi.

Ingat bahwa meskipun PySpark menawarkan banyak keunggulan untuk tugas data berskala besar, alat yang lebih sederhana seperti Pandas mungkin masih memadai untuk dataset kecil. Gunakan PySpark saat bekerja dengan data yang melampaui kemampuan satu mesin, dan selalu pertimbangkan keunggulan komputasi terdistribusinya.

Untuk mengeksplorasi PySpark lebih jauh, lihat kursus Spark mendalam kami, termasuk:

FAQ PySpark Baca CSV

Apa cara terbaik membaca berkas CSV besar di PySpark?

Praktik terbaik adalah menentukan skema kustom menggunakan StructType alih-alih mengandalkan inferSchema. Metode ini meningkatkan kinerja dengan menghindari pemindaian data berulang.

Apakah PySpark dapat menangani berkas CSV dengan delimiter berbeda?

Ya. Anda dapat menetapkan delimiter kustom menggunakan opsi delimiter dalam spark.read.csv(). Misalnya, gunakan delimiter="|" untuk nilai yang dipisahkan pipa.

Bagaimana cara membaca banyak berkas CSV sekaligus dalam sebuah direktori?

Anda dapat menggunakan path wildcard, seperti spark.read.csv("/data/*.csv", ...), untuk memuat beberapa berkas sekaligus ke dalam satu DataFrame.

Apa yang dilakukan `mode="DROPMALFORMED"` saat membaca CSV?

Ini memberi tahu Spark untuk melewati dan mengabaikan rekaman yang rusak dalam berkas CSV alih-alih menyertakannya atau menyebabkan kegagalan.

Apakah PySpark dapat membaca berkas CSV terkompresi seperti `.gz` atau `.bz2`?

Ya. PySpark secara otomatis mendekompresi dan membaca berkas CSV terkompresi tanpa memerlukan konfigurasi tambahan ketika Anda memberikan path berkas yang benar.

Derrick Mwiti

Penulis

Derrick Mwiti

Topik

Terkait

blogs

Spaghetti Plot dan Jalur Badai

blogs

Tutorial Korelasi di R

blogs

40 Pertanyaan Wawancara DBMS Teratas di 2026