Gereksinimler ve Ortam Kurulumu
Pyarrow, Apache Arrow projesinin Python arayüzüdür. Bellek içi (in-memory) veri işleme süreçlerinde hız kazandırmak için tasarlanmıştır. Kurulum için Python 3.10 ve üzeri sürümlerin yüklü olması önerilir. Gerekli kütüphaneleri kurmak için aşağıdaki komutu terminalinizde çalıştırabilirsiniz.
pip install pyarrow pandas
Kurulumun başarılı olup olmadığını kontrol etmek için Python ortamınızda import pyarrow komutunu çalıştırın. Eğer bir hata almıyorsanız, ortamınız veri analizi süreçlerine hazırdır. Pyarrow, özellikle Pandas ile entegre çalıştığında en yüksek verimi sunar.
Veri Yapılarını Anlamak: Arrow Table vs Pandas DataFrame
Pyarrow'un kalbinde Table yapısı bulunur. Pandas DataFrame'leri satır tabanlı bir yapı sunarken, Pyarrow Table yapısı sütun tabanlıdır. Bu fark, Parquet dosyalarına yazarken veya okurken çok daha hızlı işlem yapmanızı sağlar. Şimdi, basit bir veri kümesini nasıl Arrow formatına dönüştüreceğimize bakalım.
import pyarrow as pa
# Basit bir veri sözlüğü oluşturma
data = {
'kullanici_id': [1, 2, 3, 4],
'islem_tutari': [150.50, 200.00, 50.25, 300.75],
'durum': ['tamamlandi', 'beklemede', 'tamamlandi', 'iptal']
}
# Veriyi Arrow Table'a dönüştürme
table = pa.Table.from_pydict(data)
print(table.schema)
Yukarıdaki kod bloğu, Python sözlüğünü bellek üzerinde optimize edilmiş bir Arrow tablosuna dönüştürür. table.schema komutu, verinin veri tiplerini (integer, double, string) doğrulamak için kullanılır.
Adım Adım Parquet Dosyası Yazma ve Okuma
Veriyi disk üzerinde kalıcı hale getirmek için Parquet formatını kullanırız. Parquet, veriyi sıkıştırarak sakladığı için disk alanından ciddi tasarruf sağlar. Aşağıdaki örnekte, oluşturduğumuz tabloyu disk üzerine yazacağız ve tekrar okuyacağız.
import pyarrow.parquet as pq
# Tabloyu Parquet dosyası olarak kaydetme
pq.write_table(table, 'islemler.parquet')
# Parquet dosyasını okuma
okunan_tablo = pq.read_table('islemler.parquet')
print(okunan_tablo.to_pandas().head())
Burada pq.write_table fonksiyonu veriyi diske yazar. Okuma aşamasında ise read_table fonksiyonu ile veriyi tekrar belleğe alırız. to_pandas() metodu, analitik işlemler için veriyi tekrar Pandas DataFrame yapısına dönüştürmemizi sağlar.
Büyük Veri Kümeleri İçin Bölümleme (Partitioning)
Veri setiniz büyüdüğünde, tüm veriyi tek bir dosyada tutmak yerine "bölümleme" (partitioning) yöntemini kullanmalısınız. Örneğin, verileri tarihe göre klasörlere ayırmak, sorgulama hızını dramatik şekilde artırır.
# Veriyi 'durum' sütununa göre klasörleyerek yazma
pq.write_to_dataset(table, root_path='veri_seti', partition_cols=['durum'])
Bu işlem, veri_seti klasörü altında durum=tamamlandi, durum=beklemede gibi alt klasörler oluşturur. Bu yöntem, büyük veri kümelerinde sadece ilgili klasörü okumanızı sağlayarak I/O (girdi/çıktı) maliyetini düşürür.
Parquet Veri Analizi ve Performans İpuçları
Analiz yaparken tüm dosyayı okumak yerine sadece ilgili sütunları okumak, bellek tüketimini azaltır. Pyarrow, columns parametresi ile bu esnekliği sağlar.
# Sadece belirli sütunları okuma
sadece_tutarlar = pq.read_table('islemler.parquet', columns=['islem_tutari'])
toplam = sadece_tutarlar['islem_tutari'].to_numpy().sum()
print(f"Toplam Tutar: {toplam}")
Bu yaklaşım, özellikle gigabaytlarca verinin olduğu dosyalarda gereksiz sütunların belleğe yüklenmesini engeller. to_numpy() metodu, veriyi hızlı matematiksel işlemler için NumPy dizisine dönüştürür.
| Özellik | CSV | Parquet |
|---|---|---|
| Depolama | Metin (Yavaş) | İkili/Sıkıştırılmış (Hızlı) |
| Sütun Erişimi | Tüm satırı oku | Sadece ilgili sütunu oku |
| Veri Tipi | Belirsiz | Şema ile kesin tanımlı |
Güvenlik Uyarısı: Dış kaynaklardan gelen Parquet dosyalarını okurken dikkatli olun. Dosya meta verilerinin manipüle edilmesi, bellek taşması (buffer overflow) gibi zafiyetlere yol açabilir. Sadece güvenilir kaynaklardan gelen dosyaları işleyin ve üretim ortamında dosya boyutlarını sınırlayan kontroller ekleyin.
Sıkça Sorulan Sorular
Pyarrow neden Pandas yerine tercih edilmeli?
Pandas, veriyi bellekte satır bazlı tutar ve genellikle daha fazla RAM tüketir. Pyarrow ise sütun bazlıdır ve büyük veri setlerinde diskten okuma/yazma işlemleri sırasında çok daha yüksek performans sergiler.
Parquet dosyaları şifrelenebilir mi?
Evet, Pyarrow ve Parquet formatı sütun bazlı şifrelemeyi destekler. Ancak, bu işlem karmaşık bir anahtar yönetimi gerektirir ve genellikle kurumsal düzeyde yapılandırılır.
"MemoryError" alırsam ne yapmalıyım?
Dosyanın tamamını belleğe yüklemeye çalışıyor olabilirsiniz. pq.ParquetFile ile dosyayı parçalar (row groups) halinde okumayı deneyin.
Parquet dosyasının şemasını nasıl güncellerim?
Parquet dosyaları "immutable" (değiştirilemez) yapıdadır. Şema değişikliği için veriyi okuyup, şemayı güncelleyerek yeni bir dosya olarak kaydetmeniz gerekir.
Pyarrow ile SQL veritabanından veri çekilebilir mi?
Evet, Pyarrow'un flight modülü veya Pandas üzerinden SQL sorgusu sonucu dönen veriyi doğrudan Arrow tablosuna dönüştürüp kaydedebilirsiniz.
İleri Seviye Veri İşleme: Parquet Dosyalarında Şema Evrimi (Schema Evolution)
Büyük veri projelerinde veri yapısı zamanla değişebilir. Örneğin, bir sensör verisi tablosuna yeni bir sütun eklenmesi veya mevcut bir sütunun veri tipinin güncellenmesi gerekebilir. Pyarrow, ParquetDataset ve dataset modülleri ile bu şema değişikliklerini yönetmenize olanak tanır.
Şema evrimi sırasında dikkat etmeniz gereken en önemli nokta, farklı şemalara sahip dosyaların tek bir tablo altında birleştirilirken Pyarrow'un bunları nasıl hizalayacağıdır. Pyarrow, eksik sütunlar için varsayılan olarak null değerleri atar.
import pyarrow as pa
import pyarrow.parquet as pq
# Farklı şemalara sahip iki tabloyu birleştirme senaryosu
table1 = pa.Table.from_pydict({'id': [1, 2], 'deger': [10.5, 20.0]})
table2 = pa.Table.from_pydict({'id': [3, 4], 'kategori': ['A', 'B']})
# İki tabloyu birleştirirken şemaların uyumsuzluğu durumunda
# Pyarrow, eksik sütunları null ile doldurur
combined_table = pa.concat_tables([table1, table2], promote=True)
print(combined_table.to_pandas())
Parquet Veri Setlerinde Hata Ayıklama ve Dosya İnceleme
Büyük bir veri kümesiyle çalışırken, dosya bozulmaları veya beklenmedik veri tipleri ile karşılaşabilirsiniz. Pyarrow, veriyi belleğe yüklemeden önce dosya meta verilerini incelemenize olanak tanır. Bu, özellikle terabaytlarca veriyi işlerken MemoryError almamak için kritiktir.
Meta Veri (Metadata) İnceleme
Bir Parquet dosyasının içeriğini yüklemeden önce, dosyanın kaç satırdan oluştuğunu, hangi sütunların bulunduğunu ve veri tiplerini ParquetFile nesnesi üzerinden kontrol edebilirsiniz.
# Dosyayı açmadan meta verileri okuma
parquet_file = pq.ParquetFile('buyuk_veri.parquet')
# Dosya hakkındaki genel bilgiler
print(f"Toplam Satır Sayısı: {parquet_file.metadata.num_rows}")
print(f"Sütun İsimleri: {parquet_file.schema.names}")
# Belirli bir satır grubunun (row group) istatistiklerini alma
row_group_stats = parquet_file.metadata.row_group(0).column(0).statistics
print(f"Min Değer: {row_group_stats.min}, Max Değer: {row_group_stats.max}")
Veri Bütünlüğü Kontrolü
Eğer dosyanın bozuk olduğundan şüpheleniyorsanız, pyarrow.parquet.read_metadata fonksiyonu ile dosya başlığının geçerli olup olmadığını doğrulayabilirsiniz. Bu işlem, dosyanın tamamını okumadığı için oldukça hızlıdır ve üretim ortamlarında (production) veri doğrulama aşamasında kullanılabilir.
- Row Group Boyutu: Parquet dosyanızı oluştururken
row_group_sizeparametresini optimize ederek okuma performansını %30'a varan oranlarda artırabilirsiniz. - Sıkıştırma Algoritmaları:
snappyhızlı okuma için,zstdise daha yüksek sıkıştırma oranı için tercih edilmelidir. - Bellek Yönetimi: Çok büyük dosyaları okurken
use_threads=Truevememory_map=Trueparametrelerini kullanarak işletim sistemi düzeyinde bellek yönetiminden faydalanın.
Sonuç
Bu rehberde, Python ile Pyarrow kullanarak Parquet dosyalarıyla nasıl verimli bir şekilde çalışabileceğinizi öğrendiniz. Parquet, özellikle 2026 yılındaki büyük veri odaklı projelerde, hız ve depolama verimliliği sayesinde standart haline gelmiştir. Bir sonraki adım olarak, pyarrow.dataset modülünü inceleyerek çoklu dosya işleme ve paralel sorgulama konularında uzmanlaşabilirsiniz. Yazılım projelerinizde veriyi işlerken her zaman bellek kullanımını optimize etmeyi ve büyük ölçekli verilerde sütun tabanlı yaklaşımları benimsemeyi unutmayın.

Yorumlar (0)
Yorum Yaz