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()
df2.show()
df2.printSchema()
Sintaks fungsi union cukup simple, yaitu DataFrame1.union(DataFrame2)
df1.union(df2).show()
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()
Pemanggilan fungsi union berhasil (tidak menghasilkan pesan error), akan tetapi hasilnya mungkin tidak sesuai yang diharapkan.
df = df4.union(df3)
df.show()
df.printSchema()
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()
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()
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()
Jika kita gabungkan kedua DataFrame tersebut, pada hasilnya akan muncul duplikasi seperti berikut ini
df4.union(df5).show()
Untuk menghilangkan duplikasi, kita dapat menggunakan fungsi distinct() pada DataFrame hasil union.
df4.union(df5).distinct().show()
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:
-
Belajar PySpark - Pivot dan unPivot DataFrame
-
Belajar PySpark - Sort dan orderBy DataFrame
-
Belajar PySpark - Nested Schema pada DataFrame
-
Belajar PySpark - MapType pada DataFrame Schema
-
Belajar PySpark - ArrayType pada DataFrame Schema
-
Belajar PySpark - Definisi Skema pada DataFrame