CSV’yi Unutun! Karşınızda Parquet!

Fethi Tekyaygil
4 min readMay 3, 2022

--

Csv formatını hepimiz çok sevip kullanıyoruz eminim ki :) Veri setlerimizi projemize okutabilmek için pandas’ın read_csv metotu imdadımıza yetişiyordu. Peki size bunun aslında çok da iyi bir seçenek olmadığını söyleseydim?

Peki neden böyle? Csv yerine ne kullanabiliriz? Hepsi bu yazımda :) Hadi gelin başlayalım!

Csv Neden Sorunlu?

  • Csv dosyaları row-oriented yani satır bazlıdır. Bu nedenle sorgular yavaştır ve veri verimli bir şekilde saklanamaz
  • Herkes Csv dosyasının içeriğini açıp istediği gibi değiştirebilir. Bu nedenle pek de güvenli değildir
  • Gerçek dünyada Veri Bilimi ve Yapay Zeka projeleriniz için gerekli verileri ya veritabanınızda ya da bulutta depolayacaksınız. Bulutta depolamayı seçerseniz bulut hizmeti sağlayıcıları, taranan veri miktarına veya depolanan veri miktarına göre sizden ücret alacaktır. Her türlü csv dosyaları iyi bir seçenek gibi görünmüyor

Parquet Nedir?

Temelde Apache Parquet, Csv gibi bir veri tipidir. Aradaki fark, Parquet’in karmaşık veri işlemeyi desteklemek için column-oriented yani kolon bazlı bir depolama formatı olarak tasarlanmış olmasıdır.

Parquet’nin Özellikleri Nelerdir?

  • Parquet dosyaları, karmaşık iç içe veri yapıları düşünülerek tasarlanmıştır
  • Parquet, çok verimli sıkıştırma ve encoding şemalarını desteklemek için oluşturulmuştur
  • Parquet, veri dosyaları için daha düşük depolama maliyetleri sağlar ve Amazon Athena, Redshift Spectrum, BigQuery ve Azure Data Lakes gibi serverless teknolojilerle veri sorgulamanın efektifliğini en üst düzeye çıkarır
  • Apache yazılım temeli altında lisanslanmıştır ve her projeye açıktır, yani Açık Kaynak bir teknolojidir
  • Bilinen veri türlerini, dosya meta verilerini, otomatik sözlük kodlamasını destekler

Parquet vs Csv

  • Amazon S3 Fiyatlandırması (resim buradan alıntıdır):

Resme bakarsanız aynı verinin CSV halinin 1TB, Parquet olarak 130 GB alan kapladığını ve buna bağlı olarak fiyatın da yükseldiğini görebilirsiniz.

Yine aynı resme bakarsanız, veriyi sorgulama hızı konusunda da Parquet’in önde olduğunu görebilirsiniz.

  • Csv row-oriented depolanan bir veri iken, Parquet column-oriented depolanan bir veridir

Row-oriented vs Column-oriented

Elimizdeki verinin aşağıdaki gibi olduğunu düşünelim:

Row ve Column Oriented saklamada verilerimiz aşağıdaki gibi saklanacaktı:

  • Her sütun yalnızca bir veri türüne sahip olabileceğinden (int, bool, string vs.) column-oriented depolama dosyaları daha hafiftir. Bir satır genellikle birden çok veri türü içerdiğinden, satır depolamada durum böyle değildir.

Eğer bu yazıyı okuyorsanız ve buraya kadar geldiyseniz siz de yüksek ihtimalle benim gibi Python insanısınız! Bu nedenle gelin bu kıyaslamayı bir de Python üzerinden yapalım!

Pythonik Yol ile CSV vs Parquet!

İki veri tipini kıyaslayabilmek için elimde 1.2 GB’lık bir Reddit NFT Comments csv dosyası var.

Bu dosyayı okuyabilmek için ilk başta pandas kütüphanemi import ediyorum:

import pandas as pd

Sonrasında csv dosyamı okuyorum:

df = pd.read_csv('the-reddit-nft-dataset-comments.csv')

Aşağıdaki komutla dosyamın ilk 5 verisini okuyorum:

Şimdi bu dataframe nesnesini parquet olarak kaydediyorum. Bunun için aşağıdaki kodu çalıştırmam yeterli.

df.to_parquet('the-reddit-nft-dataset-comments.parquet')

to_parquet kısmının to_csv ile benzerlik gösterdiğini fark edebilirsiniz.

Parquet dosyamı incelediğimde büyüklüğün yarı yarıya düştüğünü görebilirim:

Parquet dosyamı projeme aşağıdaki gibi import ediyorum:

df_parquet = pd.read_parquet('the-reddit-nft-dataset-comments.parquet')

Aşağıdaki komutla dosyamın ilk 5 verisini okuyorum:

Fark edebileceğiniz üzere pandas, parquet ve csv dosyalarımı okuyup dataframe nesnesine atabiliyor. Csv ve Parquet okuma sonucunda dataframe nesneleri aynıdır.

KAPANIŞ

Csv’yi her ne kadar hepimiz çok sevsek ve kendisine aşina olsak da elinizde büyük boyutlu veriler olduğunda işler biraz değişiyor ve yeni bir veri formatına ihtiyaç doğuyor. Bu konuda da imdadımıza Parquet yetişiyor. Parquet bize verilerimizi column-oriented saklamamıza olanak sağlayarak daha efektif depolama ve daha hızlı sorgulama sunuyor.

Kullandığım Reddit NFT verisetine buradan ulaşabilirsiniz. Sonraki yazılarım için beni takip etmeyi unutmayın, sağlıcakla kalın, hoşçakalın :)

--

--

Fethi Tekyaygil
Fethi Tekyaygil

Written by Fethi Tekyaygil

.NET Core Backend & Google Certified Tensorflow Developer — Flutter & Solidity Padawan — Animal Person

No responses yet