Polars и ClickHouse: чтение и запись данных
Регулярная очистка исходных данных, их хранение в аналитических средах, анализ собранной информации и ее визуализация сегодня являются стандартными бизнес-задачами. Хранилища данных - это среды, в которых накапливаются проверенные и надежные данные. Для их анализа и обработки придумано и реализовано множество инструментов. ClickHouse является одним из популярнейших представителей хранилищ данных, а Polars – одним из ведущих инструментов для обработки и анализа данных.
В этой статье мы интегрируем Python - Polars - ClickHouse и приведем примеры чтения и записи данных из ClickHouse с помощью библиотеки Polars.
Polars - это чрезвычайно быстрая библиотека для обработки структурированных данных. Ядро библиотеки написано на языке Rust и доступно для Python, R и NodeJS. Объединив ClickHouse с Polars, Вы сможете обрабатывать и анализировать Ваши данные максимально эффективно.
В этой статье Вы узнаете о следующем:
- Как использовать Polars для чтения данных из ClickHouse?
- Как добавить данные в таблицу ClickHouse с помощью Polars?
Предварительные требования:
Компьютер, на котором работает Docker
Установка ClickHouse Docker
Создаем каталог:
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 и добавление данных
Подключитесь к контейнеру clickhouse, а затем – к clickhouse-client
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.
Здесь clickhouse_db взята из нашего файла docker-compose.
Создание таблицы и вставка записей:
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|
Выйдите из clickhouse-client и clickhouse container:
9dfe07f25e30 :) exit; root@9dfe07f25e30:/# exit
Создание виртуальной среды Python
Здесь я использую conda. При желании можно использовать и другие методы, например virtualenv.
conda create -n chplenv python=3.11 conda activate chplenv requirements.txt clickhouse-sqlalchemy jupyterlab polars pandas sqlalchemy pyarrow>=8.0.0
Установите пакеты pip
pip install -r requirements.txt
Запустите Jupyter Lab
jupyter lab --ip 0.0.0.0 --port 8888
Чтение таблиц ClickHouse с помощью Polars
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 count.
df.count()
Пять строк датафрейма:
Схема датафрейма Polars.
df.schema
## Output
OrderedDict([('trade_date', Date),
('crypto_name', String),
('volume', Float32),
('price', Float32),
('market_cap', Float32),
('change_1_day', Float32)])
Добавление датафрейма Polars в таблицу ClickHouse
Мы создадим датафрейм Polars и добавим его в таблицу Clickhouse. Код , указанный ниже, создаст однорядный датафрейм. Важным моментом здесь является то, что схема должна быть совместимой с таблицей.
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()
Запишем его в режиме добавления.
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()
В этой статье мы интегрировали Polars иClickHouse, а затем выполнили операции чтения и записи данных.








