Spark #13 - Spark ile Ortalama Harcama Tutarının Hesaplanması
Bu yazımızda Key/Value çiftleri ile çalışmayı göstermek için basit bir örnek üzerinden ilerleyelim. Elimizde No, isim, yaş ve harcama tutarları şeklinde virgüller ile ayrılmış aşağıdaki biçimde bir dosyamız olsun:
1, Fırat, 38, 3000
2,Murat,40,2000
3,Çağla,39,2000
4,Melis,38,7000
Bu veri seti için her yaş için ortalama harcama tutarını hesaplayan bir Spark çözümü için, önce dosyayı okuyup split etmemiz gerekecektir.
Lines=sc.textFile(”file://Data/harcamalar.csv”)
Rdd=lines.map(lambda x: (x.split(‘,’)[2] , x.split(‘,’)[3]))
#2. Eleman yaş 3. Eleman ise ortalama harcama tutarıdır. Split sonucu ilk değerin indeksi 0 dır. 1 nolu indeks=isimdir örneğin Fırat.
Böylece yaşın Key value’ nun ise harcama miktarı olduğu bir Rdd üretmiş olduk. Rdd’ miz:
38,3000
40,2000
39,2000
38,7000
Şimdi her harcama tutarından kaç tane olduğunu sayabilmek için mapValues kullanarak her bir value için (3000,2000,…) sabit “1” (bir) değerini oluşturacağız. Dikkat edin keylere hiç dokunmadık. mapValues ile sadece harcama tutarlarının (yani values) yanlarına “1” koyarak bir çift (tuple) oluşturduk. Ardından elimizdeki değerleri Key’ lere göre azaltmak için reduceByKey kullanarak, aynı Key’ e sahip değerler üzerinde toplama işlemi gerçekleştireceğiz. Böylece aynı Key’ e sahip olan 2 satırın ilk (harcama tutarı) ve ikinci elemanlarını (hepsi 1 olan) toplayıp aynı key altında indirgeyebildik:
ToplamYasaGoreHarcamalar=Rdd.mapValues(lambda x: ( x,1)).reduceByKey(lambda x,y : (x[0]+y[0] , x[1]+y[1]))
Sırayla çağırılan transformasyonların çıktılarına detaylı bakalım.
Son adımda yaş’a göre ortalamayı mapValues ile hesaplayabiliriz.
ortalamaHarcamaTutar= ToplamYasaGoreHarcamalar.mapValues(lambda x : (x[0] / x[1] ))
mapValues kullandığımız için Key’ lere dokunulmadı (Böylece daha hızlı hesaplama yapılabildi) mapValues adında da anlaşılacağı üzere sadece valuelar üzerinde çalışır ve onları yeniden map eder. ReducebyKey ile elde edilen 38, (10000,2) için mapValues x olarak (10000,2) tuple’ı üzerinde çalışarak (x[0]=10000 ve x[1]=2) 10000/2 işlemini gerçekleştirir. Bu durumda aşağıdaki sonuç RDD’ sini elde ederiz:
(38,5000) - (40,2000) - (39,2000) (Fazla yer tutumasın diye yan yana yazdık)
Yine önemli ve bildiğiniz bir noktanın altını çizelim. Yukarıdaki kod bloklarında sadece dönüşümler yaptık, bir aksiyon olmadan Spark RDD’ leri işlemeye başlamaz. Tek düğüme sığabilecek verilerde collect() veya take(5) gibi bir aksiyon ile dönüşümlerin ve hesaplamaların gerçekleşmesini sağlayabiliriz. Aşağıda sonuçları nasıl ekrana yazdırdığımı görebilirsiniz:
sonuclar= ortalamaHarcamaTutar.collect()
for sonuc in sonuclar
Print sonuç
Bir Sonraki yazımızda Key/Value çiftleri ile ilgili bir örnek daha yapacağım. Ben yazmadan önce denemek ister misiniz ? O halde örneğimizi şimdiden yazalım: Aşağıda verdiğim veri dosyası için 5 den fazla kitap okuyanların yaşları ve ortalama okumalarını raporlayabilir misiniz? (no, isim, yaş, okunan kitap sayısı)
1,Fırat, 38, 3
2,Çağla,39,6
3,Leyla,7,14
…..