Belajar PySpark - Union dan unionByName

belajar-pyspark-union-unionbyname

Operasi union menggabungkan dua atau lebih dataset dengan format atau struktur yang sama. Dalam artikel ini kita akan mempelajari mengenai fungsi pyspark untuk menggabungkan dua atau lebih DataFrame, yaitu union dan unionByName.

Sebelumnya, pastikan package pyspark sudah terinstall. Jika belum, kita bisa menggunakan perintah pip install pyspark untuk melakukan instalasi.

%pip install pyspark #jalankan untuk google colab

Selanjutnya kita import package yang akan kita gunakan, serta kita inisialisasi spark session

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

spark = SparkSession.builder.appName("Belajar PySpark - Pivot dan Unpivot").getOrCreate()


Selanjutnya kita persiapkan DataFrame yang akan kita olah

data1 = [['Agus','Fisika',150],      
        ['Dina','Fisika',180]]

data2 = [['Budi','Biologi',170],
        ['Dedi','Biologi',185],
        ['Ana','Biologi',170]]

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

df1 = spark.createDataFrame(data1,kolom)
df2 = spark.createDataFrame(data2,kolom)

 

Fungsi union

Fungsi union hanya dapat dilakukan terhadap dua dataframe dengan struktur yang sama, karena itu kita buat dua DataFrame dengan jumlah dan nama kolom yang sama

df1.show()
df1.printSchema()

dataframe 1

df2.show()
df2.printSchema()

dataframe 2

Sintaks fungsi union cukup simple, yaitu DataFrame1.union(DataFrame2)

df1.union(df2).show()

output-union-dataframe

 

Menggabungkan dua DataFrame dengan struktur berbeda

Fungsi union hanya mensyaratkan bahwa DataFrame yang digabung memiliki jumlah kolom yang sama. Bagaimana jika dataFrame yang akan digabung memiliki jumlah kolom yang sama, tetapi nama dan tipe kolom berbeda?

data3 = [['Citra',170,180],
         ['Doni',175,170]]
kolom3 = ["nama","nilai1","nilai2"]
df3 = spark.createDataFrame(data3,kolom3)

data4 = [['Agus','Fisika',150],      
        ['Dina','Fisika',180]]

kolom4 = ["nama","jurusan","nilai"]
df4 = spark.createDataFrame(data4,kolom4)

 

Kedua dataframe tersebut sama-sama memiliki jumlah kolom 3, tetapi nama dan tipe datanya berbeda

df3.show()
df3.printSchema()
df4.show()
df4.printSchema()

dataframe-berbeda


Pemanggilan fungsi union berhasil (tidak menghasilkan pesan error), akan tetapi hasilnya mungkin tidak sesuai yang diharapkan.

df = df4.union(df3)
df.show()
df.printSchema()

output-union-berbeda

 

Dari contoh di atas terlihat pyspark akan menggunakan nama sesuai dengan DataFrame pertama, sedangkan tipe data menyesuaikan dengan data yang digabungkan. Misalnya jika salah satu data bertipe string, maka kolom outputnya pun akan bertipe string.

 

Menggabungkan dua DataFrame dengan urutan kolom berbeda

Terkadang kita menemui dataset dengan nama kolom, jumlah kolom, dan tipe data yang sama, akan tetapi urutannya berbeda. Seperti dalam contoh berikut ini

data1 = [['Agus','Fisika',150],      
        ['Dina','Fisika',180]]

kolom1 = ["nama","jurusan","nilai"]

df1 = spark.createDataFrame(data1,kolom1)
df1.show()

data3 = [['Citra',170,'Fisika'],
         ['Doni',175,'Biologi']]

kolom3 = ["nama","nilai","jurusan"]

df3 = spark.createDataFrame(data3,kolom3)
df3.show()

dataframe-urutan-kolom-berbeda

 

Untuk menggabungkan dataset semacam ini, kita dapat menggunakan fungsi unionByName.
Fungsi unionByName akan menggabungkan DataFrame dan menggabungkan kolom-kolom dengan nama yang sama. Urutan kolom outputnya akan mengikuti urutan pada DataFrame pertama

df1.unionByName(df3).show()

output-unionbyname

 

Mengatasi duplikasi data

Fungsi union tidak mendeteksi adanya duplikasi data. Jika dari dua DataFrame yang kita gabungkan terdapat data yang sama, semua data tersebut akan tetap muncul dalam hasil union.

data4 = [['Agus','Fisika',150],      
        ['Dina','Fisika',180]]

data5 = [['Dina','Fisika',180],
        ['Dedi','Biologi',185]]

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

df4 = spark.createDataFrame(data4,kolom)
df5 = spark.createDataFrame(data5,kolom)

df4.show()
df5.show()

input-duplikat


Jika kita gabungkan kedua DataFrame tersebut, pada hasilnya akan muncul duplikasi seperti berikut ini

df4.union(df5).show()

output-duplikat

 

Untuk menghilangkan duplikasi, kita dapat menggunakan fungsi distinct() pada DataFrame hasil union.

df4.union(df5).distinct().show()

output-distinct

 

Wrapping up

Fungsi union digunakan untuk menggabungkan (merge/concatenate) dua DataFrame dengan struktur yang sama.
Untuk menggabungkan dua DataFrame dengan nama dan tipe kolom sama, tetapi urutannya berbeda, dapat digunakan fungsi unionByName.

File Jupyter notebook untuk tutorial ini dapat diakses di sini

Simak juga artikel-artikel sebelumnya: