Merhabalar bugünkü yazımda size PySpark Window Functions’ın işlevinden ve PySpark Sql ve PySpark DataFrame API ile kullanımından bahsedeceğim.
Pyspark: Apache Spark, Scala programlama dilinde yazılmıştır. PySpark, Apache Spark ve Python işbirliğini desteklemek yani Spark için yazılmış bir Python API’dır. PySpark sayesinde Python ve Spark’ın bazı özellikleri birlikte kullanılabilir hale gelir. Ayrıca PySpark, Apache Spark ve Python programlama dilinde Esnek Dağıtılmış Veri Kümeleri (Resilient Distributed Datasets) ile arayüz oluşturmanıza yardımcı olur. Spark, Python ve Java gibi bir programlama dili olmadığı için PySpark’a ihtiyaç duyulmuştur. Bu sayede geliştiriciler ve veri bilimciler, verileri hızlı bir şekilde sorgulamak, analiz etmek ve dönüştürmek için PySpark’ı uygulamalarına dahil ederler.
Window Functions: PySpark Window Functions işlevleri bir grup girdi satırı üzerinde çeşitli analitik işlemler gerçekleştirir ve her girdi satırı için ayrı ayrı sonuç döndürür. Bu işlemin yapılabilmesi için kullanılan veriyi partitionlamamız gerekir. PySpark Sql üç tür işlevi destekler. Bunlar;
- Sıralama Fonksiyonları
- Analitik Fonksiyonlar
- Toplama (aggregate) Fonksiyonları
Kullandığımız Versiyonlar ;
- Pyspark 3
- Python 3.6
İlk olarak gerekli kütüphaneleri import ediyoruz;
Spark session oluşturuyoruz.
Csv formatındaki datayı okuyoruz.
Datayı tanıyalım ve inceleyelim;
printSchema() fonksiyonu ile şemayı inceleyebiliriz.
Genel olarak datayı incelemek için ise show() fonksiyonunu kullanacağız.
Burada parantez içindeki ilk değer görmek istediğim satır sayısını, ikinci değer ise tüm sütunları görmek istediğimi belirtiyor.
Datamız üzerinde örnekler yapmaya başlayalım;
1. Sıralama Fonksiyonları
1.1. row_number(): 1’den başlayarak her window partitionın sonuna kadar sıralı satır numarası verir.
Bu ve diğer örnekler için oluşturulan window’da “id” kolonu partition kolonu olarak belirlenmiş ve sıralama “calldate” kolonuna göre yapılmıştır.
Çıktının idlere göre gruplandığını ve her grubun da kendi içinde calldate’e göre sıralandığını görüyoruz. Her grubun row_number’ı da kendi içinde artan şekilde verilmiştir.
1.2.rank(): Bir window partition’ları için elde edilen sonucuçları kendi içlerinde sıralar. Tekrar eden değerler varsa sonrakine geçişte değeri tekrar ettiği kadar arttırır. Daha iyi anlamak için id değeri 7 olan kişiye ait son 3 satırı inceleyebiliriz.
1.3.dense_rank(): rank() fonksiyonu ile benzer işleve sahiptir ancak sıralamada tekrarlayan değerler olsa bile boşluk bırakmaz (değer atlamaz).
1.4.percent_rank(): Temelde rank fonksiyonu ile benzer çalışır.Ancak belli farklılıklar vardır. Her window partition içindeki ilk değer 0 son değer ise 1 değerini alır. Aradakiler içinse 0-1 aralığı eleman sayısına bölünür ve sonraki satıra geçtikçe 0’dan başyarak çıkan değer kadar arttırılır.
Şu ana kadar incelediğimiz fonksiyonların işlevleri daha kolay ayırt edebilmek için aşağıdaki tabloya bakabiliriz;
1.5.ntile(): Bir window partition içindeki sonuç satırlarının göreli sırasını döndürür. İlk örnekte ntile fonksiyonuna parametre olarak 2’yi verdik yani sonuçlar 1 ya da 2 değerini alacak şekilde gelecek. İkinci örnekte ise prametre olarak 3’ü verdik bu durumda da 1-2-3 değerleri alınabilir.
2. Analitik Fonksiyonlar
2.1.cume_dist(): Bir window partition içindeki değerlerin kümülatif dağılımını eldek etmek için kullanılır.
2.2.lead(): Fonksiyonun aldığı parametredeki offset değerine göre sonraki satır verisini getiren fonksiyondur. Sql’deki lead fonksiyonu ile aynı işlevdedir. Aşağıdaki örnekte her kişinin sonraki arama tarihinin yeni kolona yazdırıldığını görebiliriz.
2.3.lag(): Fonksiyonun aldığı parametredeki offset değerine göre önceki satır verisini getiren fonksiyondur. Sql’deki lag fonksiyonu ile aynı işlevdedir. Aşağıdaki örnekte her kişinin önceki arama tarihinin yeni kolona yazdırıldığını görebiliriz.
3. Toplama (Aggregate) Fonksiyonları
Her window partition için sum, avg, max, min değerlerini hesaplayabiliriz. Bunun için aşağıdaki örneği inceleyelim.
id değeri 7 olan kaydı ele alırsak ortalama konuşma süresinin 46.75 s, toplam konuşma süresinin 374 s, min konuşma süresinin 11 s ve max konuşma süresinin 89 s olduğunu gözlemleyebiliriz.