Dalam artikel ini kita akan mempelajari mengenai groupBy dan agg, yaitu fungsi-fungsi untuk melakukan grouping dan agregasi pada pyspark DataFrame.
Bagi anda yang familiar dengan SQL atau pandas, groupBy pada pyspark dataframe serupa dengan klausa GROUP BY pada SQL ataupun pada pandas dataframe. Fungsinya adalah untuk mengelompokkan data berdasar satu atau beberapa nilai kolom yang sama.
Berikut ini dataframe yang akan kita gunakan dalam latihan:
data = [['Agus','Fisika',130,100],['Windy','Fisika',200,150],
['Budi','Biologi',200,150],['Dina','Fisika',150,200],
['Bayu','Fisika',150,200],['Dedi','Biologi',50,150]]
kolom = ["nama","jurusan","nilai1","nilai2"]
df = spark.createDataFrame(data,kolom)
df.show()
Grouping data dengan groupBy
Fungsi groupBy mengembalikan object bertipe pyspark.sql.group.GroupedData. Object ini memiliki beberapa fungsi yang diperlukan untuk melakukan agregasi, yaitu : sum, avg, max, min, count, dan agg.
result = df.groupBy("jurusan")
type(result)
Agregasi dengan sum, avg, min dan max
Jika tidak ditentukan kolom mana yang akan diagregasi (tanpa parameter), maka akan dilakukan fungsi agregasi yang sama untuk semua kolom numerik
result.avg().show()
Kita bisa memilih satu atau beberapa kolom yang akan diagregasi dengan menuliskan nama kolom sebagai parameter
df.groupBy("jurusan","semester").avg("nilai1").show()
Dengan beberapa kolom yang di-agregasi
df.groupBy("jurusan","semester").min("nilai1","nilai2").show()
Agregasi dengan count
Berbeda dengan fungsi lainnya, count() tidak menerima parameter apapun. Fungsi count() mengembalikan jumlah record tiap group
df.groupBy("jurusan").count().show()
Agregasi dengan fungsi agg()
Fungsi agg menerima parameter berupa fungsi-fungsi agregasi dari pyspark.sql.functions atau dictionary mapping {namakolom : fungsi agregasi}.
Kelebihan menggunakan agg() diantaranya adalah :
- pilihan fungsi agregasi yang lebih banyak,
- dapat menggunakan beberapa fungsi agregasi yang berbeda dalam satu grouping, dan
- dapat menggunakan alias untuk menamai kolom hasil agregasi.
Contoh agg() dengan satu fungsi agregasi
df.groupBy("jurusan").agg(F.avg("nilai2")).show()
Memanggil beberapa fungsi agregasi
df.groupBy("jurusan").agg(F.min("nilai1"),
F.max("nilai1")).show()
Menggunakan alias
Untuk memudahkan akses DataFrame hasil agregasi, kita bisa memberi nama kolom output dengan menggunakan fungsi alias()
df.groupBy("jurusan") \
.agg(F.min("nilai1").alias("min_nilai1"),
F.max("nilai1").alias("max_nilai1"),
F.median("nilai1").alias("median_nilai1"),
F.count("nilai1").alias("jumlah_siswa")).show()
Agregasi dengan agg dan dictionary
Kita dapat juga menggunakan parameter berupa dictionary. Akan tetapi cara ini cukup jarang digunakan karena sulit dibaca dan kurang fleksibel.
df.groupBy().agg(
{"*": "count","nilai1":"min","nilai2":"max"}).show()
Agregasi dengan fungsi expr()
Selain menggunakan fungsi-fungsi agregasi, kita juga dapat menggunakan fungsi expr(). Fungsi ini bermanfaat jika kita ingin melakukan pemrosesan kolom sebelum diagregasi. Misalnya seperti contoh di bawah ini
df.groupBy("jurusan", "semester").\
agg(F.expr("avg(round((nilai1 + nilai2)/5)) as rerata_total")).show()
File jupyter notebook untuk latihan ini dapat diunduh di sini.
Artikel sebelumnya :