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()
Şekil-1: Polars Dataframe Count
  • Tablodan okuduğumuz dataframe ilk beş satır
Şekil-2: Polars Dataframe Head
  • 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ı
Şekil-3: Insert DF Head
  • 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ı:
Şekil-4: Polars Inserted DF Head

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/

Yazar Hakkında
Toplam 180 yazı
Erkan ŞİRİN
Erkan ŞİRİN
10 yılı aşkın süredir yurtiçi ve yurtdışında sektörde büyük veri mühendisliği, platform yönetimi ve makine öğrenmesi ile ilgili çalışmalar yürütmekte ve aynı zamanda birçok kurum ve şirkete danışmanlık ve eğitimler vermektedir. Çalışma alanları: Data ve MLOps platformları, gerçek zamanlı veri işleme, değişen veriyi yakalama (CDC) ve Lakehouse.
Yorumlar (Yorum yapılmamış)

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

×

Bir Şeyler Ara