Apache PySpark'ta Veri Çerçevesi: Kapsamlı Eğitim [Örneklerle]

Yayınlanan: 2020-02-27

Bugün Apache PySpark'ta DataFrame hakkında bilgi edineceğiz. Pyspark, 2020'deki en iyi veri bilimi araçlarından biridir. Apache Spark'ta dağıtılmış bir satır koleksiyonunun sütunları olarak adlandırılır. Excel Sayfalarındaki Tablolara veya sütunlara çok benzer ve ayrıca ilişkisel veritabanı tablosuna benzer. PySpark DataFrame ayrıca RDD'nin benzer özelliklerine sahiptir, bunlar:

Dağıtılmış: DataFrame ve RDD'nin doğası dağıtılır

Tembel Değerlendirmeler: Eylem gerçekleştirilmezse görevin yürütülmesi yapılmaz

Immutable'ın Doğası: RDD / DataFrame'in bir diğer benzer özelliği, oluşturulduktan sonra değiştirilememesidir. Ancak RDD / DataFrame'i dönüştürmek için dönüşüm uygulanabilir.

İçindekiler

DataFrames'in Avantajı

1. Bu, API Desteği açısından faydalı olan Java, Scala, R, Python gibi birçok farklı dili destekler. Birden çok dil için API desteği, birçok programlama diliyle çalışmaya yardımcı olur.

2. DataFrame tarafından çok çeşitli veri kaynakları ve biçimleri desteklenir, bu da farklı bir veri kaynağının ve biçimlerinin uygun şekilde kullanılmasına çok yardımcı olur.

3. DataFrame'in en iyi yanlarından biri, Petabaytlarca veriyi bile işleyebilmesidir; bu, bu kadar büyük verileri işlemek için dikkate değer bir yetenektir.

4. Apache Spark, Spark DataFrame'deki gözlemle DataFrame şemasını hızla anlar. Adlandırılmış sütunların altında Spark DataFrame'in Gözlemi düzenlenir. Bu şekilde, sorgu yürütme planı optimize edilir.

5. Yarı Yapılandırılmış ve Yapılandırılmış Verilerin Büyük Hacmi, DataFrame'leri yapmak için tasarlandığından hızlı bir şekilde işlenebilir.

Apache Spark Kurulumu

Apache Spark, DataFrame İşlemleri için kullanılmaya başlanmadan önce makinede kurulmalıdır. DataFrame çeşitli DataFrame İşlemlerini desteklediği için veriler DataFrame desteği ile çalıştırılabilir. Burada bazı yaygın DataFrame' işlemlerini tartışacağız.

SparkContext'in oluşturulması, Apache'nin programlanmasındaki ilk adımdır. Bir kümede işlemlerin yürütülmesi için bir SparkContext gereksinimi vardır. Bir kümeye nasıl erişileceği SparkContext tarafından anlatılır. Ayrıca, bir küme elde edilecek konum hakkında Spark'ı gösterir.

Okuyun: Derin Öğrenme Çerçeveleri

Ardından Apache Cluster bağlantısı kurulur. Spark Shell kullanılıyorsa, oluşturulması zaten yapılmıştır. Diğer yol, yapılandırma ayarı, SparkContext'in oluşturulması için sağlanabilir, başlatılabilir ve içe aktarılabilir.

Oluşturma için bu kodu kullanabilirsiniz:

pyspark'tan SparkContext'i içe aktarın

sc = SparkContext()

CSV dosyasından DataFrame Oluşturma

CSV dosyasının okunabilmesi için python kabuğunda yeni bir kitaplık belirtilmelidir. Bunu yapmak için ilk adım, Spark-CSV paketinin en son sürümünü indirmek ve paketin Spark'ın Ana Dizininden çıkarılmasını yapmaktır. Bundan sonra, PySpark'ın kabuğunu açacağız ve paketin dahil edilmesi gerekiyor.

$ ./bin/pyspark –paketleri com.databricks:spark-csv_2.10:1.3.0

Şimdi DataFrame, veriler CSV dosyasından okunduktan sonra oluşturulacaktır.

tren = sqlContext.load(source=”com.databricks.spark.csv”, yol = 'YOL/train.csv', başlık = True,inferSchema = True)

test = sqlContext.load(source=”com.databricks.spark.csv”, yol = 'YOL/test-comb.csv', başlık = True,inferSchema = True)

Test CSV dosyaları ve tren CSV dosyaları, PATH adlı klasör konumunda bulunur. CSV dosyasında Başlık varsa, True olarak görünecektir. Veri çerçevesinin her sütunundaki veri türünü bilmek için inferSchema = True seçeneğini kullanacağız. inferSchema = True seçeneği kullanılarak, veri çerçevesinin her bir sütununun veri tipinin tespiti SQL bağlamı tarafından otomatik olarak algılanacaktır. Eğer inferSchema'yı true olarak ayarlamazsak, tüm sütunlar bir dize olarak okunacaktır.

Okuyun: Makine Öğrenimi için Python Kitaplıkları

DataFrame'in Manipülasyonu

Şimdi burada Veri Çerçevesini nasıl değiştireceğimizi göreceğiz:

  • Sütunların Veri Türünü Bilin

printSchema, sütun tipini ve veri tipini görmek için kullanılacaktır. Şimdi şema, printSchema() uygulanarak ağaç formatında yazdırılacaktır.

tren.printŞema()

Çıktı:

kök

|– User_ID: tamsayı (nullable = true)

|– Ürün_Kimliği: string (nullable = true)

|– Cinsiyet: string (nullable = true)

|– Yaş: string (nullable = true)

|– Meslek: tamsayı (nullable = true)

|– City_Category: string (nullable = true)

|– Stay_In_Current_City_Years: string (nullable = true)

|– Marital_Status: tamsayı (nullable = true)

|– Product_Category_1: tamsayı (nullable = true)

|– Product_Category_2: tamsayı (nullable = true)

|– Product_Category_3: tamsayı (nullable = true)

|– Satın alma: tamsayı (nullable = true)

csv dosyasını okuduktan sonra, veri çerçevesindeki her bir sütunun veri türünü veya şemasını doğru bir şekilde aldığımızı görebiliriz.

  • İlk n gözlem gösteriliyor

İlk n gözlemi görmek için kafa işlemi kullanılabilir. Pandaların kafa operasyonu, PySpark'ın kafa operasyonu ile aynıdır.

tren.kafa(5)

Çıktı:

[Row(User_ID=1000001, Product_ID=u'P00069042′, Gender=u'F', Age=u'0-17′, Meslek=10, City_Category=u'A', Stay_In_Current_City_Years=u'2′, Marital_Status= 0, Product_Category_1=3, Product_Category_2=Yok, Product_Category_3=Yok, Satın Alma=8370),

Row(User_ID=1000001, Product_ID=u'P00248942′, Gender=u'F', Age=u'0-17′, Meslek=10, City_Category=u'A', Stay_In_Current_City_Years=u'2′, Marital_Status=0 , Product_Category_1=1, Product_Category_2=6, Product_Category_3=14, Satın Alma=15200),

Row(User_ID=1000001, Product_ID=u'P00087842′, Gender=u'F', Age=u'0-17′, Meslek=10, City_Category=u'A', Stay_In_Current_City_Years=u'2′, Marital_Status=0 , Product_Category_1=12, Product_Category_2=Yok, Product_Category_3=Yok, Satın Alma=1422),

Row(User_ID=1000001, Product_ID=u'P00085442′, Gender=u'F', Age=u'0-17′, Meslek=10, City_Category=u'A', Stay_In_Current_City_Years=u'2′, Marital_Status=0 , Product_Category_1=12, Product_Category_2=14, Product_Category_3=Yok, Satın Alma=1057),

Row(User_ID=1000002, Product_ID=u'P00285442′, Gender=u'M', Age=u'55+', Meslek=16, City_Category=u'C', Stay_In_Current_City_Years=u'4+', Marital_Status=0 , Product_Category_1=8, Product_Category_2=Yok, Product_Category_3=Yok, Satın Alma=7969)]

Şimdi sonucu daha iyi görmek için show işlemini kullanacağız çünkü sonuçlar satır formatında gelecek. Sonucu, truncate = True argümanını kullanarak da kesebiliriz.

train.show(2,truncate= True)

Çıktı:

+——-+———-+——+—-+———-+————-+————————–+————+——————+ ——————+——————+——–+

|User_ID|Product_ID|Cinsiyet| Yaş|Meslek|City_Category|Stay_In_Current_City_Years|Medeni_Status|Product_Category_1|Product_Category_2|Product_Category_3|Satın Alma|

+——-+———-+——+—-+———-+————-+————————–+————+——————+ ——————+——————+——–+

|1000001| P00069042| F|0-17| 10| bir| 2| 0| 3| boş| boş| 8370|

|1000001| P00248942| F|0-17| 10| bir| 2| 0| 1| 6| 14| 15200|

+——-+———-+——+—-+———-+————-+————————–+————+——————+ ——————+——————+——–+

sadece ilk 2 sıra gösteriliyor

  • DataFrame satırlarının sayısının sayılması

Veri çerçevesindeki satır sayısını saymak için sayma işlemini kullanabiliriz. Şimdi sayma işlemini uygulayarak test dosyalarının satırlarını sayacağız ve dosyaları eğiteceğiz.

tren.count(),test.count()

Çıktı:

(233598, 550069)

Sırasıyla test ve eğitimde 233598, 550069 satırlarımız var.

  • Test ve tren dosyasından sütun sayısını ve sütunların adını alma

Pandaların DataFrame'indeki sütun işlemine benzer şekilde, sütunun adını almak için sütunlar işlemini kullanacağız. Şimdi ilk önce hayır yazdıracağız. sütunun adı ve test dosyasındaki ve tren dosyasındaki sütunun adı.

len(train.columns), train.columns

Çıktı:

12 ['Kullanıcı_Kimliği', 'Ürün_Kimliği', 'Cinsiyet', 'Yaş', 'Meslek', 'Şehir_Kategorisi', 'Mevcut_Şehir_Yıllarında Kalma', 'Medeni_Durum', 'Ürün_Kategori_1', 'Ürün_Kategori_1', 'Ürün_Kategori_3,'

Şimdi benzer şekilde test dosyası için yapıyoruz.

len(test.columns), test.columns

Çıktı:

13 [”, 'Kullanıcı_Kimliği', 'Ürün_Kimliği', 'Cinsiyet', 'Yaş', 'Meslek', 'Şehir_Kategorisi', 'Geçerli_Şehir_Yılları', 'Medeni_Durum', 'Ürün_Kategori_1', 'Ürün_Categori', 'Ürün_Categori ']

Yukarıdaki çıktıdan sonra eğitim dosyasında 12, test dosyasında ise 13 sütun olduğunu görebiliriz. Yukarıdaki çıktıdan, test dosyasında 13 ve eğitim dosyasında 12 sütunumuz olduğunu kontrol edebiliriz. "Tarak" sütunu, test dosyasındaki tek tek sütundur ve test dosyasında "Satın Alma" yoktur. Test dosyasında, sütunun herhangi bir adına sahip olmadığını görebildiğimiz bir sütun daha var.

  • Sayı, maks, min, standart sapma, ortalama gibi özet istatistikleri DataFrame'in sayısal sütunlarında alma

DataFrame'de işlemi tarif adlı işlemi kullanacağız. İşlemi tanımlayarak sayısal sütunun hesaplamasını yapabilir ve istatistiksel bir özet alabiliriz. Tüm sayısal sütunlar DataFrame'de hesaplanacaktır, özet istatistiklerin hesaplanmasında herhangi bir sütun adı belirtilmemiştir.

tren.açıklama().göster()

Çıktı:

+——-+——————+—————+—————-+——————+—————+——————+—— ————+

|özet| Kullanıcı_Kimliği| Meslek| Marital_Status|Product_Category_1|Product_Category_2|Product_Category_3| satın al|

+——-+——————+—————+—————-+——————+—————+——————+—— ————+

| say| 550068| 550068| 550068| 550068| 376430| 166821| 550068|

| ortalama|1003028.8424013031|8.076706879876669|0.40965298835780306| 5.404270017525106| 9.842329251122386|12.668243206790512| 9263.968712959126|

| stddev|1727.5915855308265|6.522660487341778| 0.4917701263173273|3.9362113692014082| 5.086589648693526| 4.125337631575267|5023.0653938206015|

| dk| 1000001| 0| 0| 1| 2| 3| 12|

| maksimum| 1006040| 20| 1| 20| 18| 18| 23961|

+——-+——————+—————+—————-+——————+—————+——————+—— ————+

Tanımlama işleminde, string sütun adı veya kategorik sütun adı belirtildiğinde elde ettiğimiz şey budur.

train.describe('Ürün_Kimliği').show()

Çıktı:

+——-+———-+

|özet|Ürün_Kimliği|

+——-+———-+

| say| 550068|

| demek| boş|

| standart| boş|

| dk| P00000142|

| maksimum| P0099942|

+——-+———-+

ASCII'ye göre hesaplanan max ve min değerleri. Açıklama işlemi, String type sütununda çalışmak için kullanılır.

  • DataFrame sütununun seçimi

Sütunu seçmek için seçim işleminde sütunların adını kullanacağız. Ayırarak sütunun adını virgül kullanarak belirteceğiz. Şimdi eğitim dosyasından “Age” ve “User_ID” seçiminin nasıl yapıldığını göreceğiz.

  • train.select('Kullanıcı_Kimliği','Yaş').show(5)
  • Çıktı:
  • +——-+—-+
  • |Kullanıcı_Kimliği| Yaş|
  • +——-+—-+
  • |1000001|0-17|
  • |1000001|0-17|
  • |1000001|0-17|
  • |1000001|0-17|
  • |1000002| 55+|
  • +——-+—-+
  • Bulma Farklı ürün no. test dosyalarında ve tren dosyalarında

DataFrame'in no'sunu hesaplamak için. farklı satırlar için farklı işlemi kullanacağız . Şimdi burada no hesaplaması için ayrı bir işlem uygulayacağız. test ve tren dosyasında farklı ürün.

train.select('Product_ID').distinct().count(),test.select('Product_ID').distinct().count()

Çıktı:

(3633, 3492)

Test & Train dosyasında sırasıyla 3492 ve 3633 farklı ürünümüz var. Artık eğitim dosyasında, çıktı sonucundan öğrenebileceğimiz gibi, test dosyasından daha belirgin değerlere sahip olduğumuzu biliyoruz. Şimdi, eğitim dosyasında olmayan ancak test dosyasında bulunan Ürün_Kimliği kategorilerini bulmak için çıkarma işlemini kullanacağız. Kategorik'in tüm özellikleri için de aynı şey yapılabilir.

diff_cat_in_train_test=test.select('Ürün_Kimliği').subtract(train.select('Ürün_Kimliği'))

diff_cat_in_train_test.distinct().count()# Farklı sayım için

Çıktı:

46

Yukarıdaki sonuçtan, eğitim dosyasında olmayan ancak test dosyasında bulunan 47 farklı kategori olduğunu bilebiliriz. Veriler, trenin dosyasında bulunmayan test dosyasından atlanacak veya toplanacaktır.

  • Kategorik sütunların ikili frekansının hesaplanması?

DataFrame'de kolonun ikili frekans hesaplamasını can crosstab işlemini kullanarak yapalım. Şimdi trenin DataFrame'indeki "Cinsiyet" ve "Yaş" sütunlarını crosstab işlemi uygulayarak hesaplayalım .

train.crosstab('Yaş', 'Cinsiyet').show()

Çıktı:

+———-+—–+——+

|Yaş_Cinsiyet| F| M|

+———-+—–+——+

| 0-17| 5083| 10019|

| 46-50|13199| 32502|

| 18-25|24628| 75032|

| 36-45|27170| 82843|

| 55+| 5083| 16421|

| 51-55| 9894| 28607|

| 26-35|50752|168835|

+———-+—–+——+

Cinsiyetin belirgin değeri sütun adıdır ve farklı Yaş miktarı, yukarıdaki sonuçta görülebilen satır adıdır. Tabloda, oluşmamışsa çiftin sayısı sıfır olacaktır.

Benzersiz satırlarla DataFrame nasıl edinilir?

Benzersiz satırları bulmak ve yinelenen satırları dahil etmemek için dropDuplicates işlemini kullanacağız. Bir DataFrame'in yinelenen satırlarını bırakarak Dataframe'i yinelenen satırlar olmadan alacaktır. Sütunlar için tüm benzersiz satırları almak için dropDuplicates prosedürünün nasıl yapıldığını öğrenmek için lütfen burayı kontrol edin.

train.select('Yaş','Cinsiyet').dropDuplicates().show()

Çıktı:

+—–+——+

| Yaş|Cinsiyet|

+—–+——+

|51-55| F|

|51-55| M|

|26-35| F|

|26-35| M|

|36-45| F|

|36-45| M|

|46-50| F|

|46-50| M|

| 55+| F|

| 55+| M|

|18-25| F|

| 0-17| F|

|18-25| M|

| 0-17| M|

+—–+——+

  • Satırlar nasıl bırakılır, boş değer olur mu?

Null değeri olan tüm satırları bırakmak istersek dropna işlemi denen işlemi kullanabiliriz. DataFrame'den satır bırakmak için üç seçeneği göz önünde bulundurur.

  • Alt küme – boş değerlerle sütun bırakma işlemi için dikkate alınacak tüm sütun adlarının listesidir.
  • Thresh – bu, boş olmayan değerlerle eşikten daha az satırların bırakılmasına yardımcı olur. Varsayılan olarak, bunda hiçbir şey belirtilmez.
  • Nasıl – İki tipte kullanılabilir – hepsi veya herhangi biri. Herhangi birini kullanarak, satırdaki herhangi bir değer boşsa satırı düşürür. Tümünü kullanarak, tüm satırların değerleri boşsa satırı azaltır.

Şimdi burada, subset, thresh, None for how, none, any gibi varsayılan seçenekleri kullanarak null olan satırları bırakmak için tüm bu seçenekleri tek tek kullanacağız.

tren.dropna().count()

Çıktı:

166821

  • DataFrame'in boş değerleri sabit no ile nasıl doldurulur?

Null değerleri sabit no ile doldurmak için. Burada fillna işlemini kullanacağız . Null değerleri doldurmak için fillna işleminde dikkate alınması gereken iki parametre vardır .

  • subset: Burada, doldurma değerleri için dikkate alınacak sütunların belirtilmesi gerekir.
  • değer: Burada tüm sütunlarda string, float, int gibi herhangi bir veri türü olabilen hangi değerle değiştirilecek miktarı belirtebiliriz.

Burada DataFrame treninde boş değerler yerine '-1' dolduracağız.

tren.doldur(-1).göster(2)

Çıktı:

+——-+———-+——+—-+———-+————-+————————–+————+——————+ ——————+——————+——–+

|User_ID|Product_ID|Cinsiyet| Yaş|Meslek|City_Category|Stay_In_Current_City_Years|Medeni_Status|Product_Category_1|Product_Category_2|Product_Category_3|Satın Alma|

+——-+———-+——+—-+———-+————-+————————–+————+——————+ ——————+——————+——–+

|1000001| P00069042| F|0-17| 10| bir| 2| 0| 3| -1| -1| 8370|

|1000001| P00248942| F|0-17| 10| bir| 2| 0| 1| 6| 14| 15200|

+——-+———-+——+—-+———-+————-+————————–+————+——————+ ——————+——————+——–+

sadece ilk 2 sıra gösteriliyor

Çözüm

PySpark, Yapay Zeka ve Makine öğrenimi dünyasında ivme kazanıyor. PySpark, gerçek dünyadaki makine öğrenimi problemini çözmek için kullanılır. Hem harici hem de mevcut farklı veri kaynağından RDD oluşturabilir ve üzerinde her türlü dönüşümü yapabilirsiniz. Umarım bu makale bilgilendirici olmuştur ve size PySpark veri çerçeveleri hakkında derin bilgiler verebilmiştir.

PySpark ve diğer veri bilimi araçları hakkında bilgi edinmek istiyorsanız, IIIT-B & upGrad'ın çalışan profesyoneller için oluşturulan ve 10'dan fazla vaka çalışması ve proje, pratik uygulamalı atölyeler, ile mentorluk sunan Veri Biliminde PG Diplomasına göz atın. endüstri uzmanları, endüstri danışmanlarıyla bire bir, en iyi firmalarla 400+ saat öğrenim ve iş yardımı.

PySpark Pandalardan daha mı verimli?

Evet, PySpark Pandalardan daha hızlıdır ve bir kıyaslama testinde Pandalardan bile daha iyi performans gösterir. Temel olarak, Pandas işlemleri tek bir makinede gerçekleştirirken PySpark, işlemleri birkaç makinede yürütür. Çok büyük bir veri kümesine sahip bir Makine Öğrenimi uygulaması üzerinde çalışıyorsanız, işlemleri Pandalardan 100 kat daha hızlı gerçekleştirebildiği için PySpark ideal seçenektir. JVM nedeniyle, Scala programlama dili, veri analizi ve işleme için Python'dan 10 kat daha hızlıdır. Spark kitaplıklarına çağrı yapmak için Python programlama kodu kullanıldığında, sonuçlar vasattır.

Apache PySpark kullanmanın bazı dezavantajları nelerdir?

Spark'ın kendi dosya yönetim sistemi yoktur. Spark'ı çalıştırmak için gereken ek belleğin yüksek maliyeti nedeniyle, bellek içi bilgi işlem aşırı maliyetli olabilir. Geliştiriciler, Hadoop ile Apache Spark'ı kullanırken, kompakt dosyalarla ilgili zorluklarla karşılaşır. Veriler Spark'ta gruplar halinde yinelenir ve her yineleme bağımsız olarak planlanır ve işlenir. Apache Spark'ta veriler önceden belirlenmiş bir zaman aralığında daha küçük gruplara bölünür. Sonuç olarak, kayıt tabanlı pencere kriterleri Apache tarafından desteklenmeyecektir. Bunun yerine zamana dayalı pencere kriterleri sağlar.

Datasets, DataFrame ve RDD birbirinden nasıl farklıdır?

RDD, birden çok bilgisayara dağılmış kümelenmiş bir veri öğeleri koleksiyonudur. Veriler, Java veya Scala nesnelerinin bir koleksiyonu olan RDD'ler aracılığıyla temsil edilir. DataFrame, birçok sunucuya yayılmış, adlandırılmış sütunlar halinde yapılandırılmış bir veri topluluğudur. İlişkisel bir veritabanında kavramsal olarak bir tabloya eşdeğerdir. Veri kümesi, RDD API'nin tür açısından güvenli, nesne yönelimli programlama arabirimi özelliğini sunan bir veri çerçevesi API uzantısıdır. DataFrame, RDD'ye benzer şekilde dağıtılmış bir veri topluluğudur ve değiştirilemez. Veriler, RDD yerine ilişkisel veritabanındaki bir tabloya benzer şekilde adlandırılmış sütunlar halinde yapılandırılır. Verileri gruplamak gibi basit görevler söz konusu olduğunda, RDD hem Veri Çerçevelerinden hem de Veri Kümelerinden daha yavaştır. Toplu görevleri gerçekleştirmek için basit bir API'ye sahiptir. Verileri RDD'lerden ve Veri Kümelerinden daha hızlı toplayabilir.