Belajar PySpark - Transformasi DataFrame dengan withColumn

belajar-pyspark-transformasi-dataframe-dengan-withcolumn

Fungsi withColumn di PySpark digunakan untuk menambah atau mengubah kolom sebuah DataFrame. Fungsi ini termasuk fungsi transformasi DataFrame. Artinya ia mengembalikan DataFrame baru dengan menerapkan operasi yang sesuai, tanpa mengubah DataFrame aslinya.

Fungsi withColumn digunakan ketika kita perlu melakukan operasi berbasis kolom. Misalnya : mengganti nama kolom, mengubah tipe data, mengubah nilai, atau menambah kolom baru berdasar kolom yang sudah ada.

Berikut adalah package yang akan kita gunakan dalam artikel ini:

from pyspark.sql import SparkSession
from pyspark.sql import functions as F

 

Create session, dengan nama 'Belajar PySpark - withColumn :

spark = SparkSession.builder.appName('Belajar PySpark - withColumn').getOrCreate()

 

Buat DataFrame dari sebuah python list

data = [['Agus','Fisika',100],['Windy','Fisika',200],
        ['Budi','Biologi',200],['Dina','Fisika',150],
        ['Bayu','Fisika',50],['Dedi','Biologi',50]]

kolom = ['nama','jurusan','nilai']

df = spark.createDataFrame(data,kolom)
df.show()

output dataframe

 

Update nilai sebuah kolom DataFrame

Untuk mengubah/update nilai sebuah kolom, kirim nama kolom yang akan diupdate sebagai parameter pertama

df.withColumn('nilai', col('nilai') + 100)

 

Perlu diingat bahwa operasi transformasi tidak mengubah DataFrame asli. Untuk dapat menangkap perubahan yang dilakukan, hasil transformasi tersebut harus disimpan ke dalam sebuah variabel.

df_updated = df.withColumn('nilai', col('nilai') + 100)
df_updated.show()

updated dataframe

 

Update nilai kolom DataFrame dengan sebuah nilai konstan

Untuk mengubah nilai sebuah kolom ke dalam sebuah nilai tertentu, kita tidak dapat melakukan assignment begitu saja. Nilai tersebut perlu kita ‘bungkus’ dengan fungsi pyspark.sql.function.lit(), untuk menghasilkan sebuah objek literal.

df.withColumn('nilai', F.lit(100)).show()

update dataframe dg withcolumn

 

Update nilai beberapa kolom sekaligus dengan withColumns()

Pyspark menyediakan fungsi DataFrame.withColumns() untuk mengubah nilai beberapa kolom sekaligus. Fungsi ini menerima parameter bertipe python dictionary. Python dictionary adalah objek python yang menyimpan data berupa pasangan-pasangan key:value.

Dictionary yang menjadi parameter fungsi withColumns() adalah pasangan nama kolom yang akan diupdate dan nilai barunya :

{namakolom1:nilaibaru1, namakolom2:nilaibaru2, …dan seterusnya}

 

df.withColumns(
    {'nilai': F.col('nilai')+100, 'jurusan': F.lit('Umum')}
    ).show()

update dataframe dengan withcolumn

 

Menambah kolom baru pada DataFrame

Cara menambahkan kolom baru mirip dengan update nilai kolom. Bedanya adalah parameter pertama diisi dengan nama kolom yang baru.

df.withColumn('nilai_baru', F.col('nilai') + 100).show()

kolom baru dengan withcolumn

 

Menambah beberapa kolom baru sekaligus

Untuk menambahkan beberapa kolom sekaligus, kita gunakan fungsi withColumns()

df.withColumns(
    {'nilai_baru': F.col('nilai')+100,
     'jurusan_baru': F.lit('Umum')}
    ).show()

beberapa kolom baru dengan withcolumns

 

Update nama kolom : withColumn dan withColumnRenamed

Untuk mengubah nama kolom sebuah DataFrame, kita bisa menggunakan fungsi withColumn(). Caranya :

  • membuat kolom baru dengan nama baru,
  • lalu menghapus kolom dengan nama lama, menggunakan fungsi DataFrame.drop(namakolom)
df1 = df.withColumn('nilai_total', F.col('nilai'))
df1 = df1.drop('nilai')
df1.show()

rename kolom dg withcolumn

 

Atau dapat menggunakan fungsi withColumnRenamed()

df.withColumnRenamed('nilai', 'nilai_total').show()

rename kolom dg withcolumnRenamed

 

Update nama beberapa kolom sekaligus

Untuk mengubah nama beberapa kolom sekaligus, kita bisa melakukan dengan beberapa langkah :

  • membuat beberapa kolom dengan nama baru menggunakan fungsi withColumns(),
  • kemudian menghapus kolom-kolom dengan nama lama satu persatu.
df1 = df.withColumns(
    {'nilai_total':F.col('nilai'), 'asal_jurusan':F.col('jurusan')})
df1 = df1.drop('nilai').drop('jurusan')
df1.show()

rename beberapa kolom dg withcolumns

 

Atau dapat menggunakan fungsi withColumnsRenamed(). Fungsi ini menerima parameter berupa pasangan nama_lama : nama_baru .

df.withColumnsRenamed(
    {'nilai':'nilai_total','jurusan':'asal_jurusan'}
    ).show()

rename beberapa kolom dg withcolumnsRenamed

 

 

Notebook untuk artikel ini dapat diakses di sini.

Artikel sebelumnya :