Spark Dataframe&Dataset Operasyonları-2:
Merhaba, bu yazımızda veri ön hazırlığı aşamasında, veri yüklerken, Spark Dataframe oluştururken, dataframe şekillendirirken, onu dönüştürürken, dataframe üzerinde veri keşfi yaparken vb. işlemler için kullandığım spark yapısal API operasyonlarından faydalı bulduklarımı paylaşacağım. Görkemli ve haşmetli makine öğrenmesi, derin öğrenme ve yapay zeka modelleri ile kedileri ve köpekleri ayırmak dururken bu tür basit işlerle niye uğraşıyorsun demeyin. Bahsedilen bu modellerin yakıtı o modelin istediği türden temiz ve kaliteli bir veridir. Şayet o modellerin deposuna kaliteli bir yakıt koyamaz isek görkemlerine gölge düşer, prestijleri sarsılır. Birçok insan veri yükleme ve veri hazırlığı esnasında sorun yaşıyor. Araştırmalara göre makine öğrenmesi projelerinde zaman ve emeğin yaklaşın 5’te 4’ü veri hazırlığına gidiyor. Ben de bizzat bunu tecrübe edenlerdenim.
Spark 2.0 sürümüyle birlikte Spark dataframe/dataset API’sine daha fazla önem vermeye başladı, ilişkisel dünyanın gücünü farketti sanırım 🙂 Sizlere de tavsiyem öncelikli olarak Spark RDD API ile değil Dataframe API ile uğraşın. Belli bir uzmanlık seviyesinden sonra RDD’ye de girersiniz.
Bu yazıda kullanacağım araçlar şunlardır:
- Spark Sürümü: Spark 2.3.1
- Geliştirme Ortamı: IntelliJ IDEA
- Kaynak Yönetimi: Lokal (Windows 10 üzeri Spark)
- Veri Depolama: Lokal disk
- Programlama Dili: Scala 2.11.8
- Bağımlılık Yönetimi ve Derleme: Maven
SparkSession’dan SparkContext’e Erişmek
Yukarıda bahsettiğimiz gibi Spark 2.0’dan önce spark uygulamasına geliştiriciler SparkContext ile erişiyordu. Ancak Spark 2.0 ile birlikte SparkSession geldi ve geliştiriciler artık spark uygulamasına SparkSession ile erişim sağlıyorlar. Peki biz uygulamamızda hiç RDD bazlı bir işlem yapamayacak mıyız? Hayır, yapabileceksiniz. Peki SparkContext ve sc öldümü? Hayır, ölmedi, SparkSession içinde yaşamaya devam ediyor. Eski API’dan alıştığımız ve hala sağda solda bir çok örnek uygulama, hata giderme vb. mecralarda karşılaştığımız SparkContext, HiveContext, SQLContext’e SparkSession ile erişebiliyoruz. Aşağıda SparkSession ile basit bir RDD yaratarak bunun uygulamasını yapacağız:
Kod:
import org.apache.spark.sql.SparkSession val spark = SparkSession.builder() .master("local[4]") .getOrCreate() val myRDD = spark.sparkContext.parallelize(Seq((1,2,3),(4,5,6))) myRDD.foreach(println) Sonuç: (4,5,6) (1,2,3)
Eğer shell kullanıyor iseniz SparkSession yaratmanıza gerek yok zaten shell SparkSession’ı spark değişkeninde başlatmış olarak açılıyor.
Listelerden Dataset Oluşturmak
Dataframe ve Dataset’leri oluşturmak için birçok yol var. Bunlardan birisi de listelerden dataset oluşturmak. Listeyi oluştururken aynı zamanda sütun isimlerini de belirliyoruz. Ayrıca liste ile collection kavramı altına giren sequence ve array gibi veri yapılarını kasdediyorum.
Kod:
val mySeq = Seq((1,2,3,4),(5,6,7,8),(9,10,11,12),(13,14,15,16)) val ds = spark.createDataset(mySeq) .selectExpr("_1 as col1","_2 as col2", "_3 as col3", "_4 as col4") ds.show() Sonuç: +----+----+----+----+ |col1|col2|col3|col4| +----+----+----+----+ | 1| 2| 3| 4| | 5| 6| 7| 8| | 9| 10| 11| 12| | 13| 14| 15| 16| +----+----+----+----+