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:

ClickHouse ve Polars’ı Birlikte Kullanmanın Avantajları:

Bu yazıda şunları öğreneceksiniz:

Polars ve ClickHouse’un gücünü birleştirerek verilerinizden en iyi şekilde faydalanmaya hazır olun!

Ön Gereksinimler

ClickHouse Docker Kurulum

Çalışmalarımız için bir dizin yaratıp içine girelim.

mkdir chpolars_play
cd chpolars_play/
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:
docker-compose up -d

ClickHouse tablo yaratma ve kayıt girme

docker exec -it clickhouse bash

root@9dfe07f25e30:/# clickhouse-client --host localhost --port 9000 --user clickhouse_user --password Ankara06
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.

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');
SELECT COUNT() from clickhouse_db.crypto_prices; 

COUNT()|
-------+
2382643|
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
clickhouse-sqlalchemy
jupyterlab
polars
pandas
sqlalchemy
pyarrow>=8.0.0
pip install -r requirements.txt
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)
df.count()
Şekil-1: Polars Dataframe Count
Şekil-2: Polars Dataframe Head
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()
Şekil-3: Insert DF Head
df_insert.write_database(table_name='clickhouse_db.crypto_prices', connection=engine, if_table_exists='append')
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()
Ş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

Bir yanıt yazın