Polars ClickHouse Veri Okuma ve Yazma
Ham verinin düzenli olarak temizlenerek analitik ortamlarda istiflenmesi ve buradan da analiz, görselleştirme ve yapay zeka çalışmalarının yapılması hemen hemen her işletmede standart, temel ve önemli bir ihtiyaç haline geldi. Temiz, düzgün ve güvenilir verinin biriktiği ortamların başında veri ambarları geliyor. Veri işlemek ve analiz etmek için ise bir çok araç mevcut. ClickHouse veri ambarının popüler temsilcisi iken, Polars ise Pandas ile Spark arasında veri işleme ve analiz araçlarının yıldızı parlayanlarından.
Bu yazıda, Python Polars ClickHouse entegrasyonunu yapıp, Polars kütüphanesini kullanarak ClickHouse’dan veri okuma ve yazma örneklerini yapacağız. Polars, yapılandırılmış verileri işlemek için son derece hızlı bir DataFrame kütüphanesidir. Çekirdek Rust’ta yazılmıştır ve Python, R ve NodeJS için mevcuttur. ClickHouse ile Polars’ı birleştirerek verilerinizi kolayca işleyebilir ve analiz edebilirsiniz.
Polars Neden Önemlidir?
Polars, veri analizi ve işlemede birçok avantaj sağlar:
- Hızlı: Polars, son derece optimize edilmiş bir kütüphanedir ve büyük veri kümelerini çok hızlı bir şekilde işleyebilir.
- Kolay Kullanım: Polars, Pandas’a benzer bir API’ye sahiptir ve bu nedenle kullanımı kolaydır.
- Esneklik: Polars, çeşitli veri formatlarını ve veri kaynaklarını destekler.
- Paralel İşleme: Polars, çok çekirdekli işlemcilerden yararlanarak işlemleri paralel olarak çalıştırabilir.
- Hafif: Polars, diğer veri çerçevelerine kıyasla daha hafiftir ve bu da onu daha az kaynak kullanan bir seçenek haline getirir.
ClickHouse ve Polars’ı Birlikte Kullanmanın Avantajları:
- Yüksek Performans: ClickHouse’un yüksek performansıyla Polars’ın hızı birleşerek veri işlemeyi daha da hızlandırır.
- Ölçeklenebilirlik: Hem ClickHouse hem de Polars, büyük veri kümelerini işleyebilecek şekilde tasarlanmıştır.
- Kullanım Kolaylığı: ClickHouse ve Polars, her ikisi de kullanımı kolay arayüzlere sahiptir.
- Esneklik: Farklı veri formatları ve kaynaklar ile çalışabilirsiniz.
Bu yazıda şunları öğreneceksiniz:
- ClickHouse’dan veri okumak için Polars’ı nasıl kullanabilirsiniz?
- Polars ile ClickHouse tablosuna nasıl veri ekleyebilirsiniz?
- ClickHouse ve Polars’ı kullanarak veri işlemede nasıl verimlilik sağlayabilirsiniz?
Polars ve ClickHouse’un gücünü birleştirerek verilerinizden en iyi şekilde faydalanmaya hazır olun!
Ön Gereksinimler
- Docker yüklü bir bilgisayar
ClickHouse Docker Kurulum
Çalışmalarımız için bir dizin yaratıp içine girelim.
mkdir chpolars_play cd chpolars_play/
- docker-compose.yaml
version: '3.8' services: clickhouse: container_name: clickhouse image: clickhouse/clickhouse-server:24.5.1 ports: - "8123:8123" - "9000:9000" volumes: - clickhouse_data:/var/lib/clickhouse/ environment: - CLICKHOUSE_DB=clickhouse_db - CLICKHOUSE_USER=clickhouse_user - CLICKHOUSE_DEFAULT_ACCESS_MANAGEMENT=1 - CLICKHOUSE_PASSWORD=Ankara06 volumes: clickhouse_data:
- Compose up
docker-compose up -d
ClickHouse tablo yaratma ve kayıt girme
- container ve clickhouse-client bağlanma
docker exec -it clickhouse bash root@9dfe07f25e30:/# clickhouse-client --host localhost --port 9000 --user clickhouse_user --password Ankara06
- Veri tabanlarını listeleme
9dfe07f25e30 :) show databases; SHOW DATABASES Query id: 5d620290-b6e3-420c-b59a-f2ff879e09d3 ┌─name───────────────┐ 1. │ INFORMATION_SCHEMA │ 2. │ clickhouse_db │ 3. │ default │ 4. │ information_schema │ 5. │ system │ └────────────────────┘ 5 rows in set. Elapsed: 0.004 sec.
Buradaki clickhouse_db bizim docker-compose dosyasından geldi.
- Tablo yaratma ve kayıt girme
CREATE TABLE clickhouse_db.crypto_prices ( trade_date Date, crypto_name LowCardinality(String), volume Float32, price Float32, market_cap Float32, change_1_day Float32 ) ENGINE = MergeTree PRIMARY KEY (crypto_name, trade_date); INSERT INTO clickhouse_db.crypto_prices SELECT * FROM s3('https://learnclickhouse.s3.us-east-2.amazonaws.com/datasets/crypto_prices.parquet');
- Kaç kayıt var?
SELECT COUNT() from clickhouse_db.crypto_prices; COUNT()| -------+ 2382643|
- clickhouse-client ve container çıkış
9dfe07f25e30 :) exit; root@9dfe07f25e30:/# exit
Python Virtual Environment Oluşturma
Ben burada conda kullanıyorum. Dilerseniz virtualenv gibi diğer yönetmler de olur.
conda create -n chplenv python=3.11 conda activate chplenv
- requirements.txt
clickhouse-sqlalchemy jupyterlab polars pandas sqlalchemy pyarrow>=8.0.0
- pip paketleri kurulum
pip install -r requirements.txt
- Jupyter başlatma
jupyter lab --ip 0.0.0.0 --port 8888
Polars ile ClickHouse tablosunu okuma
import polars as pl from polars import datatypes from sqlalchemy import create_engine, Column, MetaData from clickhouse_sqlalchemy import ( Table, make_session, get_declarative_base, types, engines ) from datetime import date, timedelta, datetime SQLALCHEMY_DATABASE_URL="clickhouse+native://clickhouse_user:Ankara06@<your_ip>/clickhouse_db" engine = create_engine(SQLALCHEMY_DATABASE_URL) query = "SELECT * FROM clickhouse_db.crypto_prices" df = pl.read_database(query=query, connection=engine)
- polars dataframe kaç satır?
df.count()
- Tablodan okuduğumuz dataframe ilk beş satır
- Polars dataframe şeması
df.schema ## Output OrderedDict([('trade_date', Date), ('crypto_name', String), ('volume', Float32), ('price', Float32), ('market_cap', Float32), ('change_1_day', Float32)])
Polars ile ClickHouse tablosuna yazma, kayıt ekleme
Tabloya eklemek için bir polars dataframe oluşturacağız. Aşağıdaki kod bir satırlık bir dataframe oluşturacak. Buradaki önemli nokta şemanın tabloya uyumlu olması.
df_insert = pl.DataFrame(data={'trade_date':[datetime.strptime('2024-06-04', '%Y-%m-%d').date()], 'crypto_name': ['VBOCrypto'], 'volume': [215493.0], 'price': [0.001452], 'market_cap': [253993.0], 'change_1_day': [-0.013596] }, schema=df.schema) df_insert.head()
- Yukarıdaki kodun çıktısı
- ClickHouse’a append modunda ekleyelim.
df_insert.write_database(table_name='clickhouse_db.crypto_prices', connection=engine, if_table_exists='append')
- Eklediğimiz kaydı kontrol edelim.
query_vbo = "SELECT * from clickhouse_db.crypto_prices where crypto_name = 'VBOCrypto'" df_vbo = pl.read_database(query=query_vbo, connection=engine) df_vbo.head()
- Yukarıdaki kodun çıktısı:
Bu yazımızda Polars ClickHouse entegrasyonu yaparak Polars ile ClickHouse’dan okuma ve yazma yaptık.
Bir sonraki yazıya dek hoşça kalın.
Bu ve buna benzer konularda kendinizi geliştirip iyi bir data engineer kariyeri yapmak istiyorsanız VBO Data Engineering Bootcamp programını tavsiye ederim.
Kaynaklar
- Kapak Görseli: Matthew Mazzei on Unsplash
- https://clickhouse-sqlalchemy.readthedocs.io/en/latest/index.html
- https://docs.pola.rs/