Belajar PySpark : DataFrame Union dan 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()

(gb 1)

df2.show()
df2.printSchema()

(gb 2)

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

df1.union(df2).show()

(gb 3)

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()

(gb 4)


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

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

(gb 5)

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()

(gb 6)

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()

(gb 7)

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()


(gb 8)

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

df4.union(df5).show()

(gb 9)

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

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

(gb 10)

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:

Sebuah program edukasi yang disusun oleh Solusi247 untuk membangun talenta data Indonesia

Contact Us

Segitiga Emas Business Park
Jl. Prof. Dr. Satrio KAV 6, Setia Budi
Jakarta Selatan
P: +62 21 579 511 32
M: info@datalearns247.com