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 colabSelanjutnya 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 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)
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.
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)
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)
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: